题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。节点的定义如下
typedef struct Node
{
char val;
Node* lc;
Node* rc;
Node(char x) :val(x) { lc = NULL; rc = NULL; }
}Node;
解题思路
在二叉树的前序遍历中,第一个数字总是树的根节点的值。我们可以根据该值在其中序遍历的序列中找到对应的位置,该位置左侧的值为其左子树的中序遍历结果,右侧的值为其右子树的中序遍历结果,然后将其对应在前序遍历序列中的一个范围,进行递归构建。
代码实现
static int findIndex(string inOrder,char x)
{
for (int i = 0; i < inOrder.size(); i++)
{
if (inOrder[i] == x)
return i;
}
return -1;
}
Node* reBuild(string preOrder, string inOrder, int low, int high)
{
if (preOrder.size() == 1)
{
return buyNode(preOrder[0]);
}
Node* tmp = buyNode(preOrder[low]);
int index = findIndex(inOrder, preOrder[low]);
if (index != low)
{
tmp->lc = reBuild(preOrder.substr(low + 1, index - low),\
inOrder.substr(low, index - low), 0, index - low - 1);
}
if(index != high)
{
tmp->rc = reBuild(preOrder.substr(index + 1, high - index),\
inOrder.substr(index + 1, high - index), 0, high - index);
}
return tmp;
}