重建二叉树 C语言实现

时间:2022-07-11 10:11:38

     主要根据编程之美中利用前序与中序遍历实现二叉树的重构。其中对于前序遍历中的每一个节点都是当前子树的根节点这一理论来对中序遍历进行划分。

并且也实现了根据中序遍历与后序遍历实现二叉树的重构,其中对于后序遍历主要要注意其中后序遍历的最后一个元素表示的是根节点这一思想来实现。其中对于利用前序遍历与中序遍历实现二叉树的重构的算法思想可以参考博客http://blog.csdn.net/hinyunsin/article/details/6315502。主要实现代码如下:

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

typedef char Status;

typedef struct Node
{
struct Node* Left;
struct Node* Right;
char Value;
}Node;
/*利用前序遍历与中序遍历重构二叉树*/
void ReBulid(Status *pPreOrder,Status *pInOrder,int len,Node **pRoot)
{
Node *pTemp=(Node *)malloc(sizeof(Node));
int count=0; //计数
Status *pOrgInOrder=pInOrder;
Status *pLeft=pInOrder;
int leftnum=0;
int rightnum=0;

(*pTemp).Value=*pPreOrder; //保存前序遍历的值的第一个节点
pTemp->Left=NULL;
pTemp->Right=NULL;

/*边界检测*/
if (pPreOrder ==NULL || pInOrder==NULL)
return;
if (*pRoot==NULL)
*pRoot=pTemp;
if (len==1)
return;
while (*pPreOrder!=*pLeft)
{
pLeft++;
}
leftnum=(int)(pLeft-pOrgInOrder);
rightnum=(int)(len-leftnum-1);
if (leftnum>0)
ReBulid(pPreOrder+1,pInOrder,leftnum,&((*pRoot)->Left));
if (rightnum>0)
ReBulid(pPreOrder+leftnum+1,pInOrder+leftnum+1,rightnum,&((*pRoot)->Right));
}
/*利用中序遍历与后序遍历重构二叉树*/
void ReBulid1(Status *pPostOrder,Status *pInOrder,int len,Node **pRoot)
{
Node *pTemp=(Node *)malloc(sizeof(Node));
int count=len-1; //计数
Status *pOrgInOrder=pInOrder;
Status *pLeft=pPostOrder+len-1; //指向后序遍历的最后一个节点
Status *pInLeft=pInOrder;
int leftnum=0;
int rightnum=0;

pTemp->Value=*pLeft; //保存后序遍历的值的最后一个节点
pTemp->Left=NULL;
pTemp->Right=NULL;
/*边界检测*/
if (pInOrder ==NULL || pPostOrder==NULL)
return;
if (*pRoot==NULL)
*pRoot=pTemp;
if (len==1)
return;
while (*pInLeft!=*pLeft)
{
pInLeft++;
}
leftnum=(int)(pInLeft-pOrgInOrder);
rightnum=len-leftnum-1;
if (leftnum>0)
ReBulid1(pPostOrder,pInOrder,leftnum,&((*pRoot)->Left));
if (rightnum>0)
ReBulid1(pPostOrder+leftnum,pInOrder+leftnum+1,rightnum,&((*pRoot)->Right));
}
int main()
{
char *cP="ABCDEF";
char *cI="CBAEDF";
char *cPo="CBEFDA";
Node *pRoot=NULL;
Node *pRoot1=NULL;
int len=strlen(cP);
ReBulid(cP,cI,len,&pRoot);
ReBulid1(cPo,cI,len,&pRoot1);
system("pause");
return 0;
}