- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6.9 例题分析
例6.9.1 写出二叉树的中根遍历非递归算法。
思路:为实现中根遍历LDR,
(1)从根开始沿左分支找出最左边的结点L,访问L。
(2)若L有右子树R,则按(1)处理子树R。
(3)若L无右子树,则根据搜索路径从L后退一步得到一结点,访问它并作为新的L继续处理即到(2)。直到所有结点都被访问。
按上述方式遍历,显然需要保存搜索路径,而从路径中取点是依后进先出原则。因此,用栈来保存搜索路径。
C语言实现的算法如下:
见[..\例题源代码\例题分析\EG6_9_1.cpp]
/* EG6_9_1.cpp (6.9 例题分析--例6.9.1) */
//定义二叉链表类型BiTree
typedef struct BiTNode {
char data; //数据域(元素类型以char为例)
struct BiTNode *lchild; //左指针
struct BiTNode *rchild; //右指针
}BiTNode, *BiTree;
//以上定义了树结点类型BiTNode及指向结点的指针类型(二叉链表)BiTree。
#include ..\\BiTree\\BiTUtil.h //工具包(用其中CBT2BT,ShowBT)
void InTrav3(BiTree bt) {//中序遍历二叉树-非递归
BiTNode *q, *s[20]; //s:保存结点指针的栈
int top = 0; //栈顶指针
int bTrav = 1; //继续遍历标志
q = bt; //根
do {//记当前树q为T,
//从T的根开始寻找最左边的结点并保存路径于栈中:
while(q != NULL) {
s[++top] = q; //q入栈
q = q-lchild; //继续搜索左子树
}//end while
//此时若T非空树则栈顶为其最左结点。
if(top == 0) //栈空
bTrav = 0; //结束
else {
q = s[top--]; //出栈到q
printf(%c, q-data); //访问q结点
q = q-rchild;//继续搜索右子树
}
//end if
}while(bTrav);
//end do
}//end InTrav3
//测试:
void main(void) {
/* 二叉树:
A
/ \
B C
/ \
D E
\
F
*/
char *cbt = @ABCDE^^^F;
BiTree bt;
CBT2BT(cbt, bt); //由cbt生成二叉链表bt
ShowBT(bt); //显示二叉链表bt对应的二叉树
printf(中序: ); InTrav3(bt);
printf(\n);
getchar();
}//end main
/* 输出结果:
A
B C
D E ^ ^
^ F
中序: DFBEAC
*/
例6.9.2 已知一棵二叉树的中序序列为ABCDEFG,先序序列为DBACFEG,试画出这棵二叉树。
分析:
二叉树形态:
D
/ \
B F
/ \ / \
A C E G
后序序列:ACBEGFD
例6.9.3 求二叉树中叶子结点的个数。
解:树的遍历操作是其他许多操作的基础。对本题,可以使用数种遍历操作中的任何一种,只是需要在访问结点时加判断,仅当结点是叶结点时才计数。下面这个算法countleaf是利用中序遍历实现的:
见[..\例题源代码\例题分析\EG6_9_3.cpp]
void countleaf(BiTree bt) {
if (bt == NULL) return;
countleaf(bt-lchild); //处理左子树
if((bt-lchild == NULL)
(bt-rchild == NULL))
k++; //访问该结点
countleaf(bt-rchild); //处理右子树
}//end countleaf
上面函数countleaf中的k是countleaf的上级变量,调用countleaf前先置k为0,调用后,k值就是二叉树BT中叶子结点的个数。
也可以用另一种递归算法求二叉树中叶子结点的个数,其算法如下:
int leafcount(BiTree bt) {
if (bt == NULL)
return 0; //
文档评论(0)