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

#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;
}

猜你喜欢

转载自blog.csdn.net/ZSS1753936255/article/details/71102140