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

至少需要知道前,中,后序遍历中的几种,就能重建二叉树?有无现成代码?

发布网友 发布时间:2022-05-10 21:40

我来回答

3个回答

热心网友 时间:2022-04-22 17:59

/*
实验任务:
(1) 创建二叉树,实现二叉树前序、中序、后序遍历算法。

(2)查找指定结点。
(3)设计算法统计二叉树中结点的个数、度为1的结点个数。

(4)设计算法求出二叉树的高度。
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define MAXSIZE 100
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild, *rchild;
}bitree;
void CreateBitree(bitree * &t,datatype *data)
{
bitree *St[MAXSIZE],*p=NULL;
int top=-1,k,j=0;
char ch;
t=NULL;
ch=data[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:
p=(bitree *)malloc(sizeof(bitree));
p->data=ch;
p->lchild=p->rchild=NULL;
if(t==NULL)
t=p;
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=data[j];
}
}
void visite(datatype data)
{
printf("%c\t",data);
}
void preorder ( bitree *t ) //前序遍历二叉树
{
if ( t != NULL )
{
visite (t->data);
preorder ( t->lchild );
preorder ( t->rchild );
}
}
void inorder ( bitree *t )//中序遍历二叉树
{
if ( t != NULL )
{
inorder ( t->lchild );
visite (t->data);
inorder ( t->rchild );
}
}
void postorder ( bitree *t )//后序遍历二叉树
{
if ( t != NULL )
{
postorder ( t->lchild );
postorder ( t->rchild );
visite (t->data);
}
}
bitree * find( bitree *t, datatype x) //在二叉树中查找指定节点
{
bitree *p;
if(t==NULL)
return(NULL);//空树
if (t->data==x)
return(t);//查找成功
p=find(t->lchild,x); //查找左子树
if(p==NULL)
p=find(t->rchild,x); //查找右子树
return(p);
}
int onenodenum(bitree *t)//度为1的结点个数。
{
int nl,nr;
if(t==NULL)
return 0;
if(t->lchild!=NULL && t->rchild!=NULL)
return 0;
else
return 1;
nl=onenodenum(t->lchild);
nr=onenodenum(t->rchild);
return nl+nr;
}
int nodenumber(bitree *t)//统计二叉树中结点的个数
{
int nl,nr;
int leaf;
if ( t == NULL )
return 0;
if(t->lchild==NULL && t->rchild==NULL)
return 1;
nl=nodenumber(t->lchild);
nr=nodenumber(t->rchild);
leaf=nl+nr;
return (2*leaf-1+onenodenum(t));
}
int bitreeHeight(bitree *t)
{
int lchildh,rchildh;
if(t==NULL)
return 0;
else
{
lchildh=bitreeHeight(t->lchild);
rchildh=bitreeHeight(t->rchild);
return(lchildh>rchildh)?(lchildh+1):(rchildh+1);
}
}
void printlist()
{
printf("请选择一个功能!\n");
printf("◆(1): 前序遍历\n");
printf("◆(2): 中序遍历\n");
printf("◆(3): 后序遍历\n");
printf("◆(4): 查找指定结点\n");
printf("◆(5): 统计二叉树中结点的个数、度为1的结点个数\n");
printf("◆(6): 求出二叉树的高度\n");
printf("◆(7): 离开\n");
printf("You choose: ");
}

void main()
{
int function;
int b;
bitree *t;
datatype x;
datatype data[MAXSIZE];
printf("Please input the value!\n");
scanf("%s",data);
CreateBitree(t,data);
for(b=0;b>=0;b++)
{
printlist();
scanf("%d",&function);
if(function==7)
break;
else
{
switch(function)
{
case 1:
{
preorder(t);break;
}
case 2:
{
inorder(t);break;
}
case 3:
{
postorder(t);break;
}
case 4://查找指定结点
{
bitree *s;
printf("Please input the value you want to find!\n");
fflush(stdin);//清空缓存区
scanf("%c",&x);
s=find(t,x);//将查找返回的指针赋值给s
if(s!=NULL)
printf("Successfully find!\n");
else
printf("No such node!\n");
break;
}
case 5:
{
int allnode,onenode;
allnode=nodenumber(t);
onenode=onenodenum(t);
printf("结点个数为%d,度为1的结点个数为%d\n",allnode,onenode);
break;
}
case 6:
{
int height;
height=bitreeHeight(t);
printf("二叉树的高度为%d\n",height);
break;
}
default:
printf("No such function!\n");break;
};
}
printf("Press any button to proceed\n");
printf("-------------------------------------\n");
getch();
}
}

热心网友 时间:2022-04-22 19:17

知道中,后序遍历就能够重建二叉树了。代码的话《数据结构》这本书里面有。你可以去下一个PDF版本的看一下。话说这些东西书上都有写的追问为什么不是其他两种遍历方式?

追答因为前序遍历没有办法确定二叉树的结构,所以就只剩下了中后序遍历了《数据结构》里面都有写。就在二叉树那一章。那里讲得非常清楚的。我只是手头么有这本书而已,要不我还可以告诉你在多少页= =

热心网友 时间:2022-04-22 20:52

没有
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
鞋底是空心格子怎么办 鞋里有格子硌脚怎么办 买的鞋子里面是空心格子底硌脚怎么办 鞋子底是空心格子的怎样办 浅谈NY5196—2002有机茶 有机食品茶叶标准 茶叶的储藏运销:茶叶贮藏期的化学变化 东方美人茶要怎么储存?东方美人茶储存方法 乌龙茶贮运方法 有机乌龙茶是什么贮藏与运输的? 二叉树重建递归程序详解 二叉树的重建算法是什么 煎牛排怎么腌制? 股票除息日可不可以交易股票? 我的手机在微博上获取位置数据失败,这是什么原因? 微博拟上线了真实地理位置的功能,你如何看待这个功能? 高职高专学校有哪些 深圳公办职高有哪些学校 10690759888是什么电话号码 NBA2K14的真实GS nba2k14参数设置属性 持球防守 多少 符合实际啊 求一份NBA2K14的游戏参数,我发现2K14在和舍友对战的时候,防守太不给力,贴不住人 这个配置玩nba2k14怎样,开多大特效,配置如下: 184是什么电话 求nba2k11和nba2k14最低配置要求对比 NBA2K14默认的游戏参数是多少? 184 1328 6395是啥号码? NBA2K14 电脑配置 184是什么地方的电话号码 nba2k14最低配置 从先序中序重建二叉树输出层序后序 有关重建二叉树,请教两句代码 重建二叉树,已知中序和后序遍历顺序,求先序遍历次序。 C++中如果知道了二叉树的前序和中序遍历,怎么知道后序遍历?有点急~ C++中怎样以文本形式输出二叉树? C语言中如何将一个链表保存为文件? 脸上的痘印痘坑可以用激光点阵吗,像我这种做完一次多长时间 与网络时间同步 关于中秋节的小报 粗旷的男声唱的撕心裂肺的歌手? 找一首伤感英文歌 男生唱的 高音很好听 有种撕心裂肺的感觉 求一首男生高音英文歌,是一首很好听的歌曲只是记得*部分是撕心裂肺的啊··啊·啊 一首男生说唱叫什么回来,歌词有让我死心,男的撕心裂肺喊的,最近很流行的! 是哭着说唱的歌曲,想要挽留自 比较撕心裂肺的韩文歌曲 抖音里盲僧慢放的配音《开始懂了》是谁唱的?一个男的唱的撕心裂肺的那种。 嗓音粗的男生适合唱什么歌 梁静茹的情歌,男生唱起来会有什么感觉· 歌是男的唱的,歌词里面有想你的365天,这首歌名字叫什么? 之了课堂什么时候能更新完 苹果se照相机声音如何开?