码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树重建

时间:2014-07-07 15:36:58      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:io   算法   new   type   amp   har   

假如先序串: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

二叉树重建

标签:io   算法   new   type   amp   har   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!