分享
 
 
 

第六章 树和二叉树 题解

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

第六章 树和二叉树

6.33

int Is_Descendant_C(int u,int v)/*在孩子存储结构上判定u是否v的子孙,是则返回1,否则返回0*/

{

if(u==v) return 1;

else

{

if(L[v])

if (Is_Descendant(u,L[v])) return 1;

if(R[v])

if (Is_Descendant(u,R[v])) return 1; /*这是个递归算法*/

}

return 0;

}/*Is_Descendant_C */

6.34

int Is_Descendant_P(int u,int v)/*在双亲存储结构上判定u是否v的子孙,是则返回1,否则返回0*/

{

for(p=u;p!=v&&p;p=T[p]);

if(p==v) return 1;

else return 0;

}/*Is_Descendant_P */

6.35

这一题根本不需要写什么算法,见书后注释:两个整数的值是相等的.

6.36

int Bitree_Sim(Bitree B1,Bitree B2)/*判定两棵树是否相似的递归算法*/

{

if(!B1&&!B2) return 1;

else if(B1&&B2&&Bitree_Sim(B1->lchild,B2->lchild)&&Bitree_Sim(B1->rchild,B2->rchild))

return 1;

else return 0;

}/*Bitree_Sim */

6.37

void PreOrder_Nonrecursive(Bitree T)/*先序遍历二叉树的非递归算法*/

{

InitStack(S);

Push(S,T); /*根指针进栈*/

while(!StackEmpty(S))

{

while(Gettop(S,p)&&p)

{

visit(p->data);

push(S,p->lchild);

} /*向左走到尽头*/

pop(S,p);

if(!StackEmpty(S))

{

pop(S,p);

push(S,p->rchild); /*向右一步*/

}

}/*while*/

}/*PreOrder_Nonrecursive */

6.38

typedef strUCt {

BTNode* ptr;

enum {0,1,2} mark;

} PMType; /*有mark域的结点指针类型 */

void PostOrder_Stack(BiTree T)/*后续遍历二叉树的非递归算法,用栈*/

{

PMType a;

InitStack(S); /*S的元素为PMType类型*/

Push (S,{T,0}); /*根结点入栈*/

while(!StackEmpty(S))

{

Pop(S,a);

switch(a.mark)

{

case 0:

Push(S,{a.ptr,1}); /*修改mark域*/

if(a.ptr->lchild) Push(S,{a.ptr->lchild,0}); /*访问左子树*/

break;

case 1:

Push(S,{a.ptr,2}); /*修改mark域*/

if(a.ptr->rchild) Push(S,{a.ptr->rchild,0}); /*访问右子树*/

break;

case 2:

visit(a.ptr); /*访问结点,返回*/

}

}/*while*/

}//PostOrder_Stack

分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作.

6.39

typedef struct {

int data;

EBTNode *lchild;

EBTNode *rchild;

EBTNode *parent;

enum {0,1,2} mark;

} EBTNode,EBitree; /*有mark域和双亲指针域的二叉树结点类型 */

void PostOrder_Nonrecursive(EBitree T)/*后序遍历二叉树的非递归算法,不用栈*/

{

p=T;

while(p)

switch(p->mark)

{

case 0:

p->mark=1;

if(p->lchild) p=p->lchild; /*访问左子树*/

break;

case 1:

p->mark=2;

if(p->rchild) p=p->rchild; /*访问右子树*/

break;

case 2:

visit(p);

p->mark=0; /*恢复mark值*/

p=p->parent; /*返回双亲结点*/

}

}/*PostOrder_Nonrecursive*/

分析:本题思路与上一题完全相同,只不过结点的mark值是储存在结点中的,而不是暂存在堆栈中,所以访问完毕后要将mark域恢复为0,以备下一次遍历.

6.40

typedef struct {

int data;

PBTNode *lchild;

PBTNode *rchild;

PBTNode *parent;

} PBTNode,PBitree; /*有双亲指针域的二叉树结点类型 */

void Inorder_Nonrecursive(PBitree T)/*不设栈非递归遍历有双亲指针的二叉树*/

{

p=T;

while(p->lchild) p=p->lchild; /*向左走到尽头*/

while(p)

{

visit(p);

if(p->rchild) /*寻找中序后继:当有右子树时*/

{

p=p->rchild;

while(p->lchild) p=p->lchild; /*后继就是在右子树中向左走到尽头*/

}

else if(p->parent->lchild==p) p=p->parent; /*当自己是双亲的左孩子时后继就是双亲*/

else

{

p=p->parent;

while(p->parent&&p->parent->rchild==p) p=p->parent;

p=p->parent;

} /*当自己是双亲的右孩子时后继就是向上返回直到碰到自己是在其左子树中的祖先*/

}/*while*/

}/*Inorder_Nonrecursive */

6.41

int c,k; /*这里把k和计数器c作为全局变量处理 */

void Get_PreSeq(Bitree T)/*求先序序列为k的结点的值*/

{

if(T)

{

c++; /*每访问一个子树的根都会使前序序号计数器加1*/

if(c==k)

{

printf("Value is %d\n",T->data);

exit (1);

}

else

{

Get_PreSeq(T->lchild); /*在左子树中查找*/

Get_PreSeq(T->rchild); /*在右子树中

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有