您的位置:首页 > 其它

二叉树 已知两种遍历恢复二叉树

2017-05-02 20:52 211 查看
#include <stdio.h>

#include <malloc.h>

typedef struct BiTNode

{
char data;
struct BiTNode* lchild,*rchild;

}*BiTree;

#define maxn 100

int pre[maxn],in[maxn],post[maxn];

BiTree CreateBiTree(int preL,int preR,int inL,int inR)//我们是通过先序和中序,恢复二叉树。

{
int k,numleft=0;
BiTree root;
if(preL>preR)
return NULL;//先序序列长度小于等于0的时候,我们直接返回
root=(BiTree)malloc(sizeof(struct BiTNode));//我们创建的是根节点
root->data=pre[preL];
for(k=inL;k<inR;k++)
if(in[k]==pre[preL])//我们在那中序里面找到根节点的位置
break;
numleft=k-inL;//我们记录的是左子树的个数
//****此时我们需要分析的是左子树的先序区间是[preL+1,preL+numleft],中序区间是[inL,k-1]
root->lchild=CreateBiTree(preL+1,preL+numleft,inL,k-1);//前面是在先序遍历里面左子树的范围,后面是中序是
//****此时我们需要分析的是右子树的先序区间是[preL+numleft+1,preL+numleft],中序区间是[k+1,inR]
root->lchild=CreateBiTree(preL+numleft+1,preR,k+1,inR);

return root;//返回的而是根节点

}

BiTree Create(int postL,int postR,int inL,int inR)

{
int k,numleft=0;
BiTree root;
if(postL>postR)
return NULL;//后序序列的长度小于等于0的时候,我们直接返回吧
root=(BiTree)malloc(sizeof(struct BiTNode));
root->data=post[postR];
for(k=inL;k<inR;k++)
if(in[k]==post[postR])
break;
numleft=k-inL;//左子树的个数
//此时我们就需要一起来讨论一下了。左子树在后序的区间[postL,post+numf+left],在中序的区间是[inL,k-1]
root->lchild=Create(postL,postL+numleft-1,inL,k-1);
root->rchild=Create(postL+numleft,postR-1,k+1,inR);
return root;

}

void preOrderBiTree(BiTree T)

{
if(!T)
return ;
printf("%c ",T->data);
preOrderBiTree(T->lchild);

preOrderBiTree(T->rchild);

}

void inOrderBiTree(BiTree T)

{
if(!T)
return ;
preOrderBiTree(T->lchild);
printf("%c ",T->data);
preOrderBiTree(T->rchild);

}

void postOrderBiTree(BiTree T)

{
if(!T)
return ;
preOrderBiTree(T->lchild);

preOrderBiTree(T->rchild);

printf("%c ",T->data);

}

void LayerOrder(BiTree BT)//我们开始层次遍历二叉树

{
BiTree queue[maxn],now;//我们这里的层次遍历其实就bfs的套路而已
int rear=0,front=0;
queue[rear++]=BT;//1.我们将根节点入队列
while(rear!=front)
{
now=queue[front++];//2.首先我们将队首点出队列。
printf("%d ",now->data);//3.我们访问的是队首的元素
if(now->lchild)
queue[rear++]=now->lchild;//4.我们将队首的下一个层次的节点开始入队,递归
if(now->rchild)
queue[rear++]=now->rchild;
}

}

int main()

{
int i,n;
BiTree BT;//初始化为空指针。
scanf("%d",&n);
//for(i=0;i<n;i++)
//scanf("%d",&pre[i]);
for(i=0;i<n;i++)
scanf("%d",&post[i]);
for(i=0;i<n;i++)
scanf("%d",&in[i]);
//BT=CreateBiTree(0,n-1,0,n-1);//已经知道前序,和中序。我们就恢复了一个二叉树。
//接下来就是3中遍历。
BT=Create(0,n-1,0,n-1);//我们已经知道了中序,和后序。恢复一个二叉树。
LayerOrder(BT);//我们层次遍历根节点

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐