数据结构实验报告递归和非递归遍历二叉树Word下载.docx
- 文档编号:20527255
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:9
- 大小:17.17KB
数据结构实验报告递归和非递归遍历二叉树Word下载.docx
《数据结构实验报告递归和非递归遍历二叉树Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告递归和非递归遍历二叉树Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
首先构造二叉树链表的存储结构,然后定义CreateTree(BiTree&
T)函数用于创建二叉树,并按先序次序输入二叉树结点的值,如果想停止输入某节点的值,则输入#。
通过Visit(BiTreep)函数来访问节点值。
通过outputTree(BiTreepbnode,inttotalSpace)输出二叉树结构图。
通过main()函数来调用这些方法。
第2个程序:
首先构造二叉树链表的存储结构和栈的顺序存储表示,然后定义CreateTree(BiTree&
再定义下列函数:
StackEmpty(SqStack&
S)(判断S是否是空栈)、Push(SqStack&
S,BiTreep)(将P压入栈S)、Pop(SqStack&
S,BiTree&
p)(退栈)、CountLeaf(BiTree&
T,intCount)(先序递推遍历二叉树的递推算法求叶子节点数)、InOrderTraverAndCountLeaf(BiTree&
T)(非递推遍历二叉树求叶子节点数)先按先序顺序从根节点开始将节点压入栈,若为空节点则不压入栈,P退栈,输出其节点值,如此循环,一直到遍历完为止,在此期间,如果遇到某节点左右孩子均为空,则计为一个叶子节点数。
通过outputTree()输出二叉树结构图。
以上方法通过main()实现。
具体步骤看源程序代码。
四、实验结果与结论:
(经调试正确的源程序和程序的运行结果)
1:
实现二叉树上的建立和遍历算法
编程员:
lghgxu
程序源代码:
#include"
stdio.h"
#include"
stdlib.h"
#defineOVERFLOW-2
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefstructBiTNode//二叉树链表的存储结构
{chardata;
structBiTNode*lchild,*rchild;
//左右孩子指针
}BiTNode,*BiTree;
//创建二叉树,并按先序次序输入二叉树结点的值。
voidCreateTree(BiTree&
T)
{charch;
scanf("
%c"
&
ch);
if(ch=='
#'
T=NULL;
else
{if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
//存储分配失败
T->
data=ch;
printf("
请输入%c的左子树,否则输入#\n"
T->
data);
CreateTree(T->
lchild);
printf("
请输入%c的右子树,否则输入#\n"
CreateTree(T->
rchild);
}//else
}//CreateTree
//访问二叉树节点
Visit(BiTreep)
{if(p)
{printf("
%c"
p->
returntrue;
}//if
returnfalse;
}//Visit
//先序遍历二叉树的递推算法
PreOrderTraverse(BiTree&
{if(T)
{if(Visit(T))
if(PreOrderTraverse(T->
lchild))
if(PreOrderTraverse(T->
rchild))
}//if
}
voidoutputTree(BiTreepbnode,inttotalSpace)/*输出二叉树*/
{if(pbnode!
=NULL)
{totalSpace+=8;
/*右子树与根节点相距8个空格*/
outputTree(pbnode->
rchild,totalSpace);
for(inti=0;
i<
totalSpace;
i++)
"
);
%c\n\n"
pbnode->
lchild,totalSpace);
/*递归调用左子树*/
}
voidmain()//主函数
{BiTreet;
inttotalSpace=0;
如果创建一棵树,请输入根节点数据,否则输入#\n"
CreateTree(t);
二叉树的结构图如下:
\n"
左边第一个节点是二叉树的根节点\n\n"
其上方是右子树,下方是左子树\n\n"
outputTree(t,totalSpace);
先序遍历二叉树的结果如下:
PreOrderTraverse(t);
\n恭喜你,遍历成功!
:
2:
应用实例递推和非递推法求二叉树叶子结点数
//二叉树链表的存储结构
typedefstructBiTNode
//左右孩子指针
//栈的顺序存储表示
typedefstruct
{BiTNode*base;
//栈底指针
BiTNode*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间
}SqStack;
//建立一个空栈
voidInitStack(SqStack&
S)
{S.base=(BiTree)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
if(!
S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}//InitStack
//压入栈
voidPush(SqStack&
S,BiTreep)
{if(S.top-S.base>
=S.stacksize)//满栈,追加存储结构
{S.base=(BiTree)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTNode));
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*(++S.top)=*p;
}//Push
//退出栈
Pop(SqStack&
p)
{if(S.top==S.base)
{printf("
空栈\n"
p=(BiTree)malloc(sizeof(BiTNode));
*p=*S.top;
--S.top;
}//Pop
//判断是否是空栈
StackEmpty(SqStack&
{if(S.top==S.base)
returnfalse;
//创建二叉树
%s"
//访问二叉树节点字符
//先序递推遍历二叉树的递推算法求叶子节点数
intCountLeaf(BiTree&
T,intCount)
{intcount=Count;
//Count记录叶子节点数
T)returncount;
{count=CountLeaf(T->
lchild,count);
count=CountLeaf(T->
rchild,count);
(T->
lchild)&
&
!
return(++count);
returncount;
//非递推遍历二叉树
intInOrderTraverAndCountLeaf(BiTree&
{intj=0,count=0;
BiTreep;
p=(BiTNode*)malloc(sizeof(BiTNode));
//关键一步
p=T;
SqStacks;
InitStack(s);
while(p||!
StackEmpty(s))
{if(p)
{Push(s,p);
//如果p为非空,将p压入栈
if(!
(p->
++count;
//记录叶子节点数
p=p->
lchild;
{
Pop(s,p);
//如果p为空,则p退栈
Visit(p);
p=p->
rchild;
}//while
}//InOrderTraver
{totalSpace+=8;
//主函数
voidmain()
inttotalSpace=0,count1=0,count2=0;
二叉树的结构图如下:
outputTree(t,totalSpace);
count1=CountLeaf(t,count1);
递推法遍历叉树所得叶子节点数为:
%d\n\n"
count1);
中序遍历二叉树结果如下:
\n\n"
count2=InOrderTraverAndCountLeaf(t);
\n非递推法遍历二叉树所得叶子节点数:
count2);
\n恭喜你,你成功!
五实验中遇到的问题及解决方法:
(注:
如有则写,无则可省)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 递归 遍历 二叉