由遍历序列构造二叉树
来源:互联网 发布:盛科网络上市 编辑:程序博客网 时间:2024/05/16 05:43
/*exp7-4.cpp*/
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
#define MaxWidth 40
typedef char ElemType;
typedef struct node
{
ElemType data;/*数据元素*/
struct node *lchild;/*指向左孩子*/
struct node *rchild;/*指向右孩子*/
}BTNode;
BTNode *CreateBT1(char *pre,char *in,int n)/*由先序和中序遍历序列构造二叉树*/
{
BTNode *s;
char *p;
int k;
if(n<=0) return NULL;
s=(BTNode *)malloc(sizeof(BTNode));/*创建二叉树结点*s*/
s->data=*pre;
for(p=in;p<=in+n;p++)/*在中序序列中找等于*pre的位置k*/
if(*p==*pre)
break;
k=p-in;
s->lchild=CreateBT1(pre+1,in,k);
s->rchild=CreateBT1(pre+k+1,p+1,n-k-1);
return s;
}
BTNode *CreateBT2(char *post,char *in,int n,int m)/*由中序和后序遍历序列构造二叉树*/
{
BTNode *s;
char *p,*q,*maxp;
int maxpost,maxin,k;
if(n<=0) return NULL;
maxpost=-1;
for(p=in;p<in+n;p++)/*求in中全部字符中在post中最右边的那个字符*/
for(q=post;q<post+m;q++)/*在in中用maxp指向这个字符,用maxin标识它在in中的下标*/
if(*p==*q)
{
k=q-post;
if(k>maxpost)
{
maxpost=k;
maxp=p;
maxin=p-in;
}
}
s=(BTNode *)malloc(sizeof(BTNode));/*创建二叉树结点*s*/
s->data=post[maxpost];
s->lchild=CreateBT2(post,in,maxin,m);
s->rchild=CreateBT2(post,maxp+1,n-maxin-1,m);
return s;
}
void DispBTNode(BTNode *b)/*以括号表示法输出二叉树*/
{
if(b!=NULL)
{
printf("%c",b->data);
if(b->lchild!=NULL || b->rchild!=NULL)
{
printf("(");
DispBTNode(b->lchild);/*递归处理左子树*/
if(b->rchild!=NULL) printf(",");
DispBTNode(b->rchild);/*递归处理右子树*/
printf(")");
}
}
}
void DispBTNode1(BTNode *b)/*以凹入表表示法输出一棵二叉树*/
{
BTNode *St[MaxSize],*p;
int level[MaxSize][2],top=-1,n,i,width=4;
char type;
if(b!=NULL)
{
top++;/*根结点入栈*/
St[top]=b;
level[top][0]=width;
level[top][1]=2;/*2表示是根*/
while(top>-1)
{
p=St[top];/*退栈并凹入显示该结点值*/
n=level[top][0];
switch(level[top][1])
{
case 0:type='L';break;/*左结点之后输出(L)*/
case 1:type='R';break;/*右结点之后输出(R)*/
case 2:type='B';break;/*根结点之后输出(B)*/
}
for(i=1;i<=n;i++)/*其中n为显示声宽,字符以右对齐显示*/
printf(" ");
printf("%c(%c)",p->data,type);
for(i=n+1;i<=MaxWidth;i+=2)
printf("--");
printf("\n");
top--;
if(p->rchild!=NULL)
{
top++;/*将右子树根结点入栈*/
St[top]=p->rchild;
level[top][0]=n+width;/*显示宽增width*/
level[top][1]=1;/*1表示是右子树*/
}
if(p->lchild!=NULL)
{
top++;/*将左子树根结点入栈*/
St[top]=p->lchild;
level[top][0]=n+width;/*显示场宽增width*/
level[top][1]=0;/*0表示是左子树*/
}
}
}
}
void main()
{
BTNode *b;
ElemType pre[]="ABDEHJKLMNCFGI";
ElemType in[]="DBJHLKMNEAFCGI";
ElemType post[]="DJLNMKHEBFIGCA";
b=CreateBT1(pre,in,14);
printf("先序序列:%s\n",pre);
printf("中序序列:");
printf("构造一棵二叉树b:\n");
printf("括号表示法:");DispBTNode(b);printf("\n");
printf("凹入表示法:");DispBTNode1(b);printf("\n");
printf("中序序列:%s\n",in);
printf("后序序列:%s\n",post);
b=CreateBT2(post,in,14,14);
printf("构造一棵二叉树b:\n");
printf("括号表示法:");DispBTNode(b);printf("\n");
printf("凹入表示法:\n");DispBTNode1(b);printf("\n");
}
- 由遍历序列构造二叉树
- 由遍历序列构造二叉树
- 由遍历序列构造二叉树
- 由遍历序列构造二叉树
- 上机作业之树:二叉树遍历算法、由遍历序列构造二叉树算法
- 由中序遍历序列和后序遍历序列构造二叉树(递归实现)
- 由遍历序列得到二叉树
- 由遍历序列还原二叉树结构
- 由初始序列构造二叉搜索树,输出层次遍历,并判断是否是完全二叉树
- 由二叉树的遍历序列恢复二叉树
- 由二叉树的前序遍历序列和中序遍历序列求后序遍历序列
- 由已知的层次遍历序列构建二叉树
- 由先序遍历和中序遍历构造二叉树的二叉链表代码
- 由二叉树的两个遍历序列求另一个遍历序列
- 由前序遍历序列和中序遍历序列重建二叉树
- 由中序遍历序列和后续遍历序列恢复二叉树
- 由先序序列/后序序列和中序序列构造二叉树
- 根据中序和层次遍历序列,构造二叉树
- Master-Mind Hints UVa340 排序&&查找
- c# 文件及目录操作类
- Android锁屏后调用了ondestroy()方法,解屏后重新oncreate()的问题的解决方案。
- 基于openswan klips的IPsec VPN实现分析(九)加密算法维护
- 基于ALSA的WAV播放和录音程序
- 由遍历序列构造二叉树
- 我犯过的错误-代码易错点
- A/B测试全面指南
- vs2012更改默认开发环境
- 关于Linux的视频编程(v4l2编程)
- Android软件安全与逆向分析
- 社区专家谈 12306
- Java application和applet区别
- 破解Mac OS X 管理员密码[转]