试验 叶子结点计算
姓名: xxx 班级: xxx)
学号: 16130xxxxx 时间.10.22
1 问题描述
二叉树叶子节点计算
1.二叉树创建
2.二叉树图形显示
3.二叉树叶子节点计算
2 结构设计
二叉树叶子结点计算关键是二叉树创建, 在这里选择存放结构是一个链式存放结构
Data | lchild | rchild |
建立结构体
struct BTNode{
int data;
BTNode*lchild;
BTNode*rchild;
};
3 算法设计
在程序正式编写之前我定义了多个功效函数
(1)指针清空函数, 预定义一个指针bt 使lchild和rchild值分别给予bt而且使其为空
static int clear(BTNode *bt)
{
if (bt)
{
clear(bt->lchild );
clear(bt->rchild );
cout<<"释放了指针"<<bt<<"所指向空间"<<endl;
delete bt;
}
return 0;
};
(2)叶子结点计数算法
叶子结点特点是左孩子和右孩子均为空, 利用这个特点能够轻松判定出是否是叶子节点, 利用递归算法处理这个问题, 预先定义一个计数器count 当所遇结点满足叶子结点条件时, count+1
static int Leaf(BTNode *p,int&count)
{
if(p)
{
if(p->lchild==NULL&&p->rchild==NULL)count++;
Leaf(p->lchild,count);
Leaf(p->rchild,count);
}
return count;
}
(2)二叉树创建
一样是利用递归方法, 输入参数包含指针, 左右判定, 以及判空条件
static int create(BTNode *p,int k ,int end)
{
BTNode *q;
int x;
cin>>x;
if(x!=end)
{
q=new BTNode;
q->data =x;
q->lchild=NULL;
q->rchild=NULL;
if(k==1)p->lchild=q;
if(k==2)p->rchild=q;
create(q,1,end);
create(q,2,end);
}
return 0;
};
(3)类结构函数创建树而且输入各结点数值
在这里, 采取时先序遍历法依次输入树中各结点数值
Step 1:定义新结构体指针,
Step 2:申请动态存放空间;
Step 3:输入节点元素, 而且指针后移到输入结点后继结点, end作为结点结束标志;
Step 4:反复步骤3, 直到输入结束;
void BinaryTree::CreateBiTree (int end)
{
cout<<"请根据先序序列次序输入二叉树, -1为空指针域标志: "<<endl;
BTNode *p;
int x;
cin >>x;
if(x==end)return;
p=new BTNode;
if(!p)
{
cout<<"申请内存失败"<<endl;
exit(-1);
}
p->data =x;
p->lchild =NULL;
p->rchild =NULL;
BT=p;
create(p,1,end);
create(p,2,end);
}
(4)按树形图输出树
Step 1:定义结点bt 计数器level
Step 2:当bt存在 bt指向左孩子, level+1换行, 输出结点值
Step 3:bt 指向右孩子level+1输出数值, 依次递归
void BinaryTree::DisplayBTreeShape (BTNode*bt, int level)
{
if(bt)
{
DisplayBTreeShape(bt->rchild,level+1);
cout<<endl;
for(int i=0;i<level-1;i++)
cout<<" ";
cout<<bt->data;
DisplayBTreeShape(bt->lchild,level+1);
}二叉树的遍历及应用实验报告
}
4程序运行测试
输入该树先序遍历
1, 2, 3, (-1, -1), 4(-1, -1), 5, 6(-1.-1)(-1)
5调试统计及收获
调试统计:
(1)在开始编译过程中, , 程序编译不经过在case选择中创建被直接跳过, 仔细检验过程中, , 发觉在类调用过程中缺乏了类主体, 在后期其它练习中一样碰到了kidding错误, 在后期处理方法中在论坛上到了处理方法及犯错原因
initialization of 'XXX' is skipped by 'case' label 原因及处理措施
原创 08月12日 18:34:05 1461
犯错代码段:
switch (t)
{
case 0:
int a = 0;
break;
default:
break;
}
编译时提醒: “error C2361: initialization of 'a' is skipped by 'default' label”。这怎么可能?
犯错原因:
C++约定, 在块语句中, 对象作用域从对象申明语句开始直到块语句结束, 也就是说default标号后语句是能够使用对象a。假如程序实施时从switch处跳到default处, 就会造成对象a没有被正确地初始化。确保对象初始化可是C++关键设计哲学, 所以编译器会很严格地检验这种违例情况, 像上述示例代码中default语句后面并没有使用a, 但考虑到以后代码改动可能无意中使用, 所以一样被封杀。
明白了原因, 处理起来就很轻易了。只要明确地限制对象a作用域就行了。
switch (t)
{
case 0:
{ //added for fix problem
int a = 0;
break;
} //added for fix problem
default:
break;
}
处理方案
在结构中不能在case中定义新变量, for(int i = 0;...)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论