首页 > 代码库 > 二叉树重建

二叉树重建

假如先序串:DBACEGF,先序的第一个节点一定是根节点,这样我们就知道了根节点是D.
再看中序, 在中序串之中,根结点的前边的所有节点都是左子树中,ABCDEFG,所以D节点前面的ABC就是左子树的中序串。
再看前续串 DBACEGF, 由于左子树的节点是ABC,我们可以得到左子树的前续周游的串为: BAC. 有了左子树的前序串BAC,
和中序串ABC ,我们就可以递归的把左子树给建立起来。 同样,可以建立起右子树。编程之美有讲到这个算法

// date: 6/29
// 已知前序 跟中序 重建二叉树

#include <stdio.h>

#define TREELEN 6

typedef struct NODE
{
char value;
NODE* pLeft;
NODE* pRight;
}NODE;

void ReBuild(char* pPreOrder,
char* pInOrder,
int TreeLen,
NODE** pRoot)
{
if(pPreOrder == NULL || pInOrder == NULL)
{
return;
}

//获得根节点
NODE* pTemp = new NODE;
pTemp->value = http://www.mamicode.com/*pPreOrder;
pTemp->pLeft = NULL;
pTemp->pRight = NULL;

//保存输出的根节点
if(*pRoot == NULL)
{
*pRoot = pTemp;
}

if(TreeLen == 1)
{
return ;
}

// 找出子树的强度 然后递归
char* pOrgInOrder = pInOrder;
char* pLeftEnd = pInOrder;
int nTempLen = 0;

while(*pPreOrder != *pLeftEnd)
{
if(pPreOrder == NULL || pLeftEnd == NULL)
{
return;
}
nTempLen++;

if(nTempLen>TreeLen)
{
break;
}
pLeftEnd++;
}

//len of left child tree
int nLeftLen =0;
nLeftLen = (int)(pLeftEnd-pOrgInOrder);

//len of right child tree
int nRightLen = 0;
nRightLen = TreeLen-nLeftLen-1;

//rebuild left tree
if(nLeftLen>0)
{
ReBuild(pPreOrder+1,pInOrder,nLeftLen,&((*pRoot) ->pLeft ));
}

if(nRightLen>0)
{
ReBuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,nRightLen,&((*pRoot) ->pRight ));
}

}

int main()
{
char szPreOrder[TREELEN] = {‘a‘,‘b‘,‘d‘,‘c‘,‘e‘,‘f‘};
char szInOrder[TREELEN] = {‘d‘,‘b‘,‘a‘,‘e‘,‘c‘,‘f‘};

NODE* pRoot = NULL;
ReBuild(szPreOrder,szInOrder,TREELEN,&pRoot);
}