二叉树后序线索化Word文档格式.docx
- 文档编号:19036005
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:13
- 大小:470.82KB
二叉树后序线索化Word文档格式.docx
《二叉树后序线索化Word文档格式.docx》由会员分享,可在线阅读,更多相关《二叉树后序线索化Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
{
inta,j;
BTREEbt;
bt=null;
start:
printf("
---------------------------------------------------------\n"
);
\n┃★★★★★★★★★★★★★┃"
\n┃【1】.成立一棵二叉树┃"
\n┃【2】.二叉树后序线索化┃"
\n┃MadeBy:
08321224饶立平┃"
\n┃★★★★★★★★★★★★★┃\n"
请选择:
"
scanf("
%d"
&
j);
switch(j)
{
case1:
{
printf("
***********************\n"
┃输入二叉树的根结点:
┃\n"
请输入结点:
"
scanf("
a);
bt=BThead(a,null,null);
/*成立二叉树根结点*/
bttree(bt);
/*成立二叉树的各个结点*/
gotostart;
/*返回主菜单*/
}
case2:
if(bt==null)
{
printf("
**************************************\n"
二叉树不存在,请从头成立二叉树。
\n"
}
else
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n"
*****二叉树后序序列如下*****\n"
**********\n"
POSTREAD(bt);
/*后序线索化二叉树*/
\n〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n"
}
}
2、成立一棵二叉树各结点
依照用户自己的输入,第一成立二叉树的根结点,然后依照二叉树的构造,用户自己可随意输入各个结点的左小孩和右小孩,直至整个二叉树构建完成。
(2)算法描述:
通过自概念的BTREEBThead函数来成立用户输入的根结点,以后用一个堆栈STACK[top]来贮存结点,和一个while(top>
-1)循环来实现用户对各个结点的成立,每成立一个结点贮存在STACK[top]中,top+1;
假设要返回上一结点,那么只需top-1,进行出栈操作即可。
如此,便实现了随意构造某结点的左小孩和右小孩,从而使得用户创建二叉树而不受限制。
voidbttree(BTREEbt)
intk,top=-1;
intb,c=0;
STACK[++top]=bt;
/*头结点进栈*/
while(top>
-1)
q=STACK[top];
/*把栈顶结点元素赋值给q*/
b=q->
data;
printf("
****************************************************\n"
┃☆╭┐┌╮☆°
.·
┃╭┘└┘└╮∴°
☆°
1.添加结点(%d)的左小孩。
b);
┃└┐..┌┘—╮∴°
2.添加结点(%d)的右小孩。
┃╭┴——┤├╮3.返回上一个结点。
┃│o o│ │●°
4.二叉树已经成立完成。
┃╰┬——╯ │∴°
·
┃☆9-|-9--/∴☆.☆╭┐┌╮☆°
scanf("
k);
switch(k)
{
if(q->
lchild!
=null)
********************************************\n"
结点(%d)已经有了左小孩,请从头选择。
\n"
***************************\n"
┃输入结点(%d)的左小孩结点:
┃\n"
请输入:
scanf("
c);
T=BTlchild(q,c);
/*成立左小孩结点T*/
STACK[++top]=T;
/*左小孩结点进栈*/
}break;
rchild!
结点(%d)已经有了右小孩,请从头选择。
┃输入结点(%d)的右小孩结点:
T=BTrchild(q,c);
/*成立右小孩结点T*/
/*右小孩结点进栈*/
case3:
q=STACK[top--];
break;
/*最后一个结点出栈*/
case4:
top=-1;
/*清空堆栈*/
}
-------------------------------------------\n"
二叉树已经成立完成,如下所示:
****************************\n"
*****number\tdata*****\n"
outbtree(bt);
/*输出二叉树的结点*/
3、对二叉树进行后序线索化
用户成立好一个完整的二叉树后,为了使二叉树的遍历操作提供了更多的方便,而且不需要设置堆栈,将左右小孩不为空的标志域lbit或rbit置为1。
(2)算法描述:
通过利用二叉树的二叉链表结构中的那些空的指针域,来指出二叉树中每一个结点在那个序列中的直接前驱结点和直接后继结点是什么,用递归构造一个后序遍历方式实现线索化的函数,依次判定某结点的左小孩或右小孩是不是为空,假设不为空,那么将其标志域lbit或rbit置为1。
(3)程序代码:
BTREEpost;
voidPOSTREAD(BTREET)
if(T)
POSTREAD(T->
lchild);
/*递归线索左子树*/
POSTREAD(T->
rchild);
/*递归线索右子树*/
if(!
T->
lchild)
T->
lbit=1;
/*T的标志域置为1*/
lchild=post;
if(!
rchild)
rbit=1;
if(post&
&
post->
rbit==1)
post->
rchild=T;
post=T;
%d"
T->
data);
/*输出访问的结点*/
四、成效及存在问题
1、主菜单界面
如图4-1.1所示,以构造一棵图示的二叉树为例,成立二叉树后输出该二叉树的各个结点,对其进行后序线索化,并以后序序列的形式输出。
图:
4-1.1
2、创建根结点
3、创建各个结点左右小孩
图4-3.1,成立根结点1的左小孩结点2.
图4-3.2,成立结点2的右小孩结点5.
图4-3.3,返回结点5的上一个结点2.
依照系统提示可别离成立各个结点的左右小孩结点,直至一棵二叉树成立完成。
由于该二叉树的结数比较多,在此不一一列出各结点的成立进程。
4、输出二叉树各结点
5、对二叉树后序线索化
6、存在的问题
本系统尽管能够成功运行,也能实现课题要求的各个功能,可是因为时刻缘故部份细节问题尚未有效的解决。
一是在输出二叉树各个结点的时候,编号没有递增显示;
二是我一直在构造一个在输出二叉数的各个结点时能够显示各结点的左右小孩结点的数据,我别离用了一个q->
lchild->
data和q->
rchild->
data来显示小孩结点寄存的数据,可是当某结点左右小孩为空时,那么系统会犯错,在那个问题上浪费了较多的时刻,只好舍去了。
五、心得
通过本次《数据结构》课程设计使我对二叉树后序线索化的原理有了较为清楚的明白得,能够说明原先不懂的程序,关于各类函数的挪用也有了专门好的把握,对C语言程序设计也有了必然的提高。
在拿到那个课题之前教师就交待过不能剽窃网上的程序,于是,在接到二叉树线索化那个课题后我便将书上二叉那张从头又看了一遍,第一个闪过的念头确实是我想做一个能够由用户自己依照二叉树的构造随意成立个各个结点,直至整个二叉树构造完成。
也确实是说,能够不用依照该二叉树的前、中、后序序列来构造二叉树,只需用户依照系统提示,依次成立各个结点的左右小孩即可。
在程序设计中,也碰着了很多的问题,有时候运行时不免会碰到很多语法错误,最终都算是一一调试成功,我是在c++的环境下用c语言来进行编程,在c++和c中都能正常运行,只是因为c不技持中文和部份字符的显示。
以致程序运行时会显现乱码。
能够说,在本次《数据结构》课程设计中我是受益非浅啊,看着自己做好的程序不由自喜一把,关于c语言的运用和VC的编程软件把握更上了一个台阶,我会继续加油尽力的!
六、参考文献
数据结构教程(第二版)唐发根编著
北京航空航天大学出版社
C语言程序设计夏涛编著
北京邮电大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 树后序 线索