首页 > 其他 > 详细

二叉树重建

时间:2014-07-07 15:35:57      阅读:297      评论:0      收藏:0      [点我收藏+]
假如先序串: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 = *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);
}

二叉树重建,布布扣,bubuko.com

二叉树重建

原文:http://www.cnblogs.com/jameskun/p/3815203.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!