您的位置:首页 > 编程语言

【编程之美】3.9重建二叉树

2014-09-26 16:40 302 查看
题目:

给定一棵二叉树,假定每个节点都用唯一的字符表示,具体结构如下:

struct NODE {
NODE* pLeft;
NODE* pRight;
char chValue;
};
假设已经有了前序遍历和中序遍历结果,希望通过一个算法重建这棵树。
给定函数的定义如下:

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot);
参数
pPreOrder:前序遍历结果的字符串数组。
pInOrder: 中序遍历结果的字符串数组。
nTreeLen: 树的长度。
pRoot: 根据前序和中序遍历结果重新构建树的根节点。
例如
前序遍历结果:a b d c e f
中序遍历结果:d b a e c f

思路:不难,根据前序遍历结果找跟,根据中序遍历结果划分左右子树,递归求解。

/*
start time = 15:55
end time = 16:23
*/
#include<iostream>
using namespace std;

typedef struct NODE{
NODE *pLeft, *pRight;
char chValue;
}NODE;

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot)
{
if(pPreOrder == NULL || pInOrder == NULL) //边界条件不要忘了 这是看答案后补上的
{
return;
}
if(nTreeLen <= 0)
{
return;
}
//重建根节点 一定是先序遍历的第一个值
*pRoot = new NODE;
(*pRoot)->chValue = pPreOrder[0];
(*pRoot)->pLeft = NULL;
(*pRoot)->pRight = NULL;

//查找根在中序遍历中的位置,把中序遍历表转化为左子树和右子树两个部分
int iLocateRoot;
for(iLocateRoot = 0; iLocateRoot < nTreeLen; iLocateRoot++)
{
if(pInOrder[iLocateRoot] == pPreOrder[0])
{
break;
}
}

//重建左子树
Rebuild(pPreOrder+1, pInOrder, iLocateRoot, &((*pRoot)->pLeft));
//重建右子树
Rebuild(pPreOrder+iLocateRoot+1, pInOrder + iLocateRoot + 1, nTreeLen - iLocateRoot - 1, &((*pRoot)->pRight));
}

int main()
{
char pre[7] = {'a','b','d','c','e','f','\0'};
char in[7] = {'d','b','a','e','c','f','\0'};
NODE * T = NULL;
Rebuild(pre, in, 7, &T);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: