问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

找某*P结点中序线索二叉树在前序下的后继结点

发布网友 发布时间:2022-05-30 21:57

我来回答

2个回答

热心网友 时间:2023-11-23 11:50

#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
typedef enum{Link,Thread} PointerTag; //指针域是孩子还是线索的标志
typedef struct node{
DataType data; //数据域
PointerTag ltag,rtag; //指针域信息的标志
struct node * lchild,* rchild; //指针域

}BinTNode; //线索树结点
typedef BinTNode *BinTree;
BinTNode *pre=NULL; //前驱指针

void CreateBinTree(BinTree *T) //按前序建立二叉树,数据按前序输入
{
char ch;
if((ch=getchar())==' ')
*T=NULL;
else{
*T=(BinTNode*)malloc(sizeof(BinTNode));
(*T)->data=ch;
CreateBinTree(&(*T)->lchild);
CreateBinTree(&(*T)->rchild);

}

}

void InorderThreading(BinTree p) //递归函数,建立中序线索信息.注意这里有两个指针p和pre,其中pre指向p的前驱结点
{
if(p)
{
InorderThreading(p->lchild);
p->ltag=(p->lchild)? Link:Thread;
p->rtag=(p->rchild)? Link:Thread;
if(pre)
{
if(pre->rtag==Thread)
pre->rchild=p;
if(p->ltag==Thread)
p->lchild=pre;
}
pre=p;
InorderThreading(p->rchild);
}
}

void Inorder(BinTree T) //递归方式中序遍历
{
if(T){
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);

}
}

void forder(BinTree T) //递归方式前序遍历
{
if(T){
printf("%c",T->data);
forder(T->lchild);
forder(T->rchild);

}
}

void lorder(BinTree T) //递归方式后序遍历
{
if(T){
lorder(T->lchild);
lorder(T->rchild);
printf("%c",T->data);

}
}

BinTNode * InorderSuccessor(BinTNode *p) //求p的中序后继,如果p结点的rtag域为线索,则其后继就是rchild指向结点,否则其后继是其右子树最左下结点.
{
BinTNode *q;
if(p->rtag==Thread)
return p->rchild;
else
{
q=p->rchild;
while(q->ltag==Link)
q=q->lchild;
return q;
}
}

BinTNode * InorderPrioror(BinTNode *p) //求p结点的前驱,如果p结点的ltag域为线索,则其前驱就是lchild指向结点,否则其前驱是其左子树最右下结点.

{
BinTNode *q;
if(p->ltag==Thread)
return p->lchild;
else
{
q=p->lchild;
while(q->rtag==Link)
q=q->rchild;
return q;
}
}

void TraverseInorderTree(BinTree p) //使用线索进行中序遍历,这时不需使用递归方式
{
if(p)
{
while(p->ltag==Link)
p=p->lchild;
do
{
printf("%c",p->data);
p=InorderSuccessor(p);
}while(p);
}
}

void main() //主函数,具体实现什么功能参考上面注释,很简单的
{ BinTree Tree;
BinTNode *s,*p;
CreateBinTree(&Tree);
forder(Tree);
printf("\n");
Inorder(Tree);
printf("\n");
lorder(Tree);
printf("\n");
InorderThreading(Tree);
s=InorderSuccessor(Tree->lchild);
printf("\noutput successor:");
printf("%c\n",s->data);
printf("\noutput prioror:");
p=InorderPrioror(Tree->lchild);
printf("%c\n",p->data);
TraverseInorderTree(Tree);

热心网友 时间:2023-11-23 11:50

分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么牌子洗发水香味好闻持久 有哪些留香久的香氛洗发水值得入手? 香味持久的洗发水有哪些? 洗发水香味最持久排行 家装适合什么地板 客厅地板装修什么地板好 我家装修是北欧风格,想选一款与家里装修风格相匹配的地板,有何推荐? 什么样的装修用什么样的地板好 镇域 村镇 集体建设用地的区别 农村宅基地的升值之路:农民的生存保障还是财富陷阱? 求教,关于后序线索化二叉树建立及遍历 “先序线索化” &#47;&#47;递归出错,同样的方式实现中序、后序线索化二叉树却是正确的,代码如下 &#47;&#47;先序遍历线索 用中序,先序,后续线索化二叉树,c实现 9、 一棵左右子树均不为空的二叉树在后序线索化后(不带头结点的线索化),其空指针域数为 Java课程设计 构造先序和后序线索二叉树 ()的遍历仍需要栈的支持? 1.前序线索树 2.中序线索树 3.后序线索树 原因?答案是C 这是猫头鹰吗?还是鹰?谁能给我说说是什么种类! 邮政扫码机4660怎么拆机换屏 烟草专用的扫码机突然停用了 chiki chiki的歌词是什么意思?? &quot;为了不哭大声笑&quot;是哪首歌的歌词 2007年1月到4月最新的电影 小眼睛,亮晶晶,看一看,说一说,写一写,是什么意思? 与鱼类有关的生字? 带鱼的字与什么有关? 公文表达以什么为主什么和什么为辅 乡镇街道在公文中怎么表述 公文的表达方式有哪些 如果不这样做,公文怎么表述 2个月零10天这样公文表述是否正确 芮的汉字释义 苹果4s相机翻转怎么调正照片 如果仓鼠睁着眼睛一会动一下会怎么样 如果仓鼠不抢食物是不是就不会打架了? 如果给仓鼠抓到会,怎样? 仓鼠爱打架吗?仓鼠打架怎么办? 古希腊流传至今的最早的文学作品 偷渡回来被警方抓到怎么办 牛字变形假斯文(打一字) 请问哪位有毕加索的牛的变形全过程的图? 哪些字作偏旁时其形态、大小、笔画发生了变化? “钱塘江”的资料 从四明山丹山赤水景区自驾前往鹿亭中村要多久 宁波中村要门票吗 鹿亭中村到丹水赤山多少公里? 余姚中村村从余姚到鹿亭中村怎样走 顺治二年(1645),清兵南下,越城已降,黄宗羲奉太夫人避居鹿亭中村(见《黄梨洲先生年谱》)。 余姚鹿亭中村到天下玉苑怎么走 余姚市鹿亭乡中村到陆埠中村几公里 宁波市区到余姚鹿亭乡中村自驾怎么走