北邮数据实验报告二叉树文档格式.docx
- 文档编号:16396360
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:27
- 大小:92.11KB
北邮数据实验报告二叉树文档格式.docx
《北邮数据实验报告二叉树文档格式.docx》由会员分享,可在线阅读,更多相关《北邮数据实验报告二叉树文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
3采用递归的思想,分别将根节点的左右孩子作为根节点,递归调用该函数。
完成
对左右子树的赋值。
B.代码详细分析:
template<
classT>
voidBiTree<
T>
:
Create(Node<
*&
R,T*buf,inti)
{
if(buf[i-1]==0)
R=NULL;
else
R=newNode<
;
R->
data=buf[i-1];
Create(R->
lch,buf,2*i);
rch,buf,2*i+1);
}
}
二、前序遍历二叉树:
(非递归)
A.自然语言描述:
1:
建立栈
2:
判断该栈是否为空并且根节点是否为空指针
3:
如果根节点不是空指针,则输出它的data域,并且是它入栈
4:
入栈后将根节点指针指向它的左孩子
5:
如果根节点是空指针
6:
则根节点出栈,并且指向根节点的指针指向它的右孩子
B.代码详细分析:
template<
voidBiTree<
Preorder(Node<
*R)
Stack<
Node<
*>
S;
while(!
S.IsEmpty()||(R!
=NULL))
if(R!
=NULL)
Print(R->
data);
S.Push(R);
R=R->
lch;
R=S.Pop();
rch;
三:
中序遍历二叉树:
(非递归)
A.自然语言描述:
如果根节点不是空指针,将它入栈
则根节点出栈,输出该节点的data域,并且指向根节点的指针指向它的右孩子
B.代码详细分析:
Inorder(Node<
=NULL)
{
else
}
四:
后序遍历二叉树:
(递归)
判断根节点是否为空
如果根节点不为空
递归调用后续遍历函数,函数的参数改为根节点的左孩子
递归调用后续遍历函数,函数的参数改为根节点的右孩子
输出根节点的data域
Postorder(Node<
=NULL){
Postorder(R->
lch);
rch);
}
1
五:
层序遍历二叉树:
递归调用层续遍历函数,函数的参数改为根节点的左孩子
递归调用层序遍历函数,函数的参数改为跟结点的右孩子
Levelorder(Node<
Queue<
Q;
Q.IsEmpty()||(R!
Q.EnQueue(R->
R=Q.DelQueue();
六:
求二叉树的深度:
判断根节点是否为空,如果根节点为空,返回0
如果根节点不为空但是根节点的左右孩子同时为空,返回1
如果以上两个条件都不成立
递归调用求二叉树的深度,函数的参数改为根节点的左孩子,并且深度初始化
为1
递归调用求二叉树的深度,函数的参数改为跟结点的右孩子,并且深度初始化
为0
返回4与5步中得出深度较大的那个数作为二叉树的深度数
intBiTree<
GetDepth(Node<
*R,intd)
if(R==NULL)returnd;
if((R->
lch==NULL)&
&
(R->
rch==NULL))
returnd+1;
intm=GetDepth(R->
lch,d+1);
intn=GetDepth(R->
rch,d+1);
returnn>
m?
n:
m;
七:
二叉树的销毁:
(递归:
后续)
递归调用二叉树的销毁函数,参数改为根节点的左孩子
递归调用二叉树的销毁函数,参数改为根节点的右孩子
释放根节点指向的内存
Destroy(Node<
Destroy(R->
deleteR;
八:
求二叉树的叶子结点数:
(左+右+1)
判断根节点是否为空,如果为空,返回0
如果根节点不为空,切根节点的左右孩子同时为空,返回1
递归调用求二叉树的叶子节点数函数,参数改为根节点的左孩子
递归调用求二叉树的叶子结点数函数,参数改为根节点的右孩子
返回根节点的左右子树的叶子结点数之和
LeafNodeCount(Node<
if(R==NULL)return0;
rch==NULL))
return1;
intn=LeafNodeCount(R->
intm=LeafNodeCount(R->
returnm+n;
九:
求二叉树的结点数:
递归调用求二叉树的结点数的函数,参数改为根节点的左孩子
递归调用求二叉树的结点数的函数,参数改为根节点的右孩子
返回根节点的左右字数的结点数之和
NodeCount(Node<
intm=NodeCount(R->
intn=NodeCount(R->
returnm+n+1;
十、求指定结点到根的路径:
将s指针走过的路径存在数组Node<
*stack[10000];
中,如果找到指定元素,就输出该元素到根的路径,就是输出存在该数组中的地址的data域。
template<
Path(Node<
*root,charm)//求路径
Node<
*s;
inttag[10000];
inttop=0;
s=root;
do
{
while(s!
{
top++;
stack[top]=s;
tag[top]=0;
s=s->
}
if(top>
0)
if(tag[top]==1)
{
if(stack[top]->
data==m)
{
cout<
<
"
路径:
for(inti=top;
i>
=1;
i--)
stack[i]->
data;
break;
}
top--;
}
else
s=stack[top];
if(top>
{
s=s->
tag[top]=1;
}
}while(s!
=NULL||top!
=0);
2.3其他
对二叉树的操作上,前序遍历与中序遍历采用了非递归算法,后续遍历,层序遍历,求
二叉树深度,求二叉树叶子结点数,求二叉树结点数等函数采用了递归算法。
每一个操作都可以选择递归和非递归两种方法。
非递归算法可以提高运算的性能。
3.程序运行结果
主函数流程图如下:
程序运行结果截图:
4.总结
在本次试验中,我掌握了二叉树基本操作的实现方法。
在一系列操作中,既可以采用递归算法又可以采用非递归算法。
当然,不管是递归还是非递归算法,只要理解了运行的步骤,就可以。
这次试验非递归算法直接明了,运算性能好,但是程序代码多。
非递归算法代码少,但是不宜理解中间过程。
在本次试验中,又强化了我对递归算法的理解。
源代码:
fonction.h
#include<
iostream>
usingnamespacestd;
classNode
public:
Tdata;
*lch;
*rch;
intltag;
intrtag;
Node():
lch(NULL),rch(NULL),ltag(0),rtag(0){};
//对这些变量赋初值
};
classstacknode//栈结点
*treenode;
//
inttag;
classBiTree//二叉树的实现
*root;
//根节点
BiTree():
root(NULL){}
*&
Root();
//返回root指针
voidCreate(Node<
*&
R,T*buf,inti);
voidDestroy(Node<
*R);
voidPrint(Te);
~BiTree();
//intSearch(Node<
*R,Te,Node<
p);
intLeafNodeCount(Node<
intNodeCount(Node<
intGetDepth(Node<
*R,intd);
*GetRoot(){returnRoot;
}//
voidGetPath(Tx,Node<
*R);
voidLevelorder(Node<
voidPreorder(Node<
voidInorder(Node<
voidPostorder(Node<
R,T*PreBuf,int&
i,T*InBuf,intb,inte);
voidPath(Node<
*root,char);
classStack//栈
{
Stack():
Top(NULL){}//赋初值
intIsEmpty();
//判断栈是否为空
TGetTop();
//找top的data
voidPush(T);
//把T放进栈中
TPop();
//pop出去
~Stack();
protected:
structNode//
Node*next;
Node*Top;
classQueue//队列
Queue();
//判断是否为空
voidEnQueue(T);
//入队
TDelQueue();
//删除元素
TGetFront();
//获取front的data
~Queue();
structNode
Node*Front;
Node*Rear;
BiTree<
Root()
returnroot;
//使用顺序结构存储的数据建立二叉链表树
//左孩子
//右孩子
//销毁二叉树
//后续删除
Print(Te)
cout<
e;
~BiTree()
Destroy(root);
//销毁二叉树的函数
GetPath(Tx,Node<
*R)//前序遍历输出路径
intf=0,r=0;
boolw=false;
char>
Queue[100];
if(R->
data!
=x)
if(w==false)
Queue[++r].data=R->
if(R->
lch!
=NULL)//前序遍历输出路径
GetPath(x,R->
rch!
if(w==true)
{
if(f!
=r)
cout<
Queue[++f].data<
"
}
else
r--;
cout<
data<
由该节点到根节点的路径为"
for(intk=0;
k<
3;
k++)
Queue[k].data;
w=true;
}
}//查询树中的结点
/*template<
Search(Node<
*R,Te,Node<
p)
if(R->
data==e){p=R;
return1;
if(Search(R->
lch,e,p))
returnSearch(R->
rch,e,p);
return0;
*/
//求树的叶结点数
//求树的结点总数
//求树的深度
//非递归先序遍历
//非递归中序遍历
//递归调用的后续遍历
//层序遍历二叉树
intStack<
IsEmpty()
if(Top==NULL)return1;
elsereturn0;
TStack<
GetTop()
if(Top==NULL)returnT();
elsereturnTop->
voidStack<
Push(Tt)
Node*s=newNode;
s->
data=t;
next=Top;
Top=s;
TStack<
Pop()
Tt;
if(Top==NULL)
栈空,溢出"
endl;
else{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 实验 报告 二叉