请教一道考研数据结构题

hxtx 2003-10-21 09:49:44
已知二叉树的中序和后序遍历序列存放在数组in[]和post[]中,试编一个算法创建这棵二叉树。
...全文
41 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fztx 2003-10-28
  • 打赏
  • 举报
回复
我写出了!
#include "iostream.h"
#include "malloc.h"
#include "string.h"
typedef struct node{
char data;
struct node *lc,*rc;
}btree;



btree *build_btree2(char *ppos,char *ipos,int n)
{
btree *ptr;
char *rpos;
int k;
if(n<=0)return NULL;
ptr=(btree *)malloc(sizeof(btree));
ptr->data=*ppos;
ptr->lc=ptr->rc=NULL;
for(rpos=ipos;rpos<ipos+n;rpos++)
if(*rpos==*ppos)break;
k=rpos-ipos;
ptr->lc=build_btree2(ppos+n-k,ipos,k);
ptr->rc=build_btree2(ppos+1,rpos+1,n-k-1);
return ptr;
}

void daozuan(char a[],int n)
{
int i=0,j=n-1,char t;
while(i<=j){
t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}
}

void post(btree *root)
{
if(root){
post(root->lc);
cout<<root->data<<" ";
post(root->rc);
}

}

void main()
{
btree *root;
char a[]="cbeda";
char b[]="bcaed";
daozuan(a,strlen(a));
root=build_btree2(a,b,strlen(a));
post(root);
cout<<endl;
}
bobob 2003-10-28
  • 打赏
  • 举报
回复
对基本功要求很强,不过很容易理解啊
由中序得到根结点,把数组post分成左右子树
递归
jakeye 2003-10-28
  • 打赏
  • 举报
回复
懒的想,但只要了解中序和后序的遍历方法,就不难写出来,但要注意数组的下标.
eliza007 2003-10-22
  • 打赏
  • 举报
回复
从中序知道根节点,从后序知道左右子树
panzhaoping 2003-10-21
  • 打赏
  • 举报
回复
数据结构真好。
ZhangYv 2003-10-21
  • 打赏
  • 举报
回复
由先中序列恢复一棵确定的二叉树,并对其做后序遍历的输出,要点是如何控制传递数组的下标的值.
中后序还原也一样,树是可以根据此唯一递归定义的:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX 100

typedef struct node
{
char info;
struct node *llink,*rlink;
}TNODE;

char pred[MAX],inod[MAX];
TNODE *restore(char *,char *,int);
void postorder(TNODE *);

main(int argc,char * *argv)
{
TNODE *root;
if(argc<3)
exit(0);
strcpy(pred,argv[1]);
strcpy(inod,argv[2]);
root=restore(pred,inod,strlen(pred));
postorder(roor);
printf("\n\n");
}

TNODE *restore(char *ppos,char *ipos,int n)
{
TNODE *ptr;
char *rpos;
int k;
if(n<=0)
return NULL;
ptr=(TNODE*)malloc(sizeof(TNODE));
ptr->info=*ppos;
for(rpos=inpos;rpos<ipos+n;rpos++)
if(*rpos==*ppos)
break;
k=rpos-ipos;
ptr->llink=restore(ppos+1,ipos,k);
ptr->rlink=restore(ppos+1+k,rpos+1,n-1-k);
return ptr;
}

void postorder(TNODE *ptr)
{
if(ptr==NULL)return;
postorder(ptr->llink);
postorder(ptr->rlink);
printf("%c",ptr->info);
}
langzi8818 2003-10-21
  • 打赏
  • 举报
回复
先把这个二叉树画出来,在创建就好的多了
aflyinghorse 2003-10-21
  • 打赏
  • 举报
回复
李春保的 数据结构习题与解析中以有这题的解答
rocllllll 2003-10-21
  • 打赏
  • 举报
回复
快了,我正复习到这,估计过几天就可以了
不过,兄弟,还是要自己来的,总是问别人是不行的
我现在包括C和数据结构一起复习,感觉已经上路了
目前正在前进中...
tibetan 2003-10-21
  • 打赏
  • 举报
回复
基本思路是用低归。
从中序中知道左子树,从后续中就可以知道左字书对应的右子树。就这样。
loveisbug 2003-10-21
  • 打赏
  • 举报
回复
教材里有思路的吧。
hxtx 2003-10-21
  • 打赏
  • 举报
回复
上面朋友写的是由先序和中序建立。
由先序和中序建立我也会(李春葆书上写的)
关键是由中序和后序如何建立?

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧