0 题目
输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。
1 分析
中序遍历的结果,优先打印根节点,然后左右节点。
前序遍历的结果,优先打印左节点,然后根节点,右节点。
因此,中序遍历中第一个元素,在前序遍历的结果中可以将这个数组一分为三:左子树,根节点,右子树
因此左子树的个数可以求出来,假设为n,那么在前序遍历的结果中,第2~n个节点就是在左子树的,是左子树的前序遍历结果。 这一部分是原来问题的一个子问题。
TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> in)
{
// 当其中一个 长度为0的时候,表明没有节点了,因此其根节点的对应子树应为nullptr
// 因此这里返回nullptr
int inlen = in.size();
if (inlen == 0)
{
return nullptr;
}
vector<int> left_pre, right_pre, left_in, right_in;
TreeNode *head = new TreeNode(pre[0]);
int gen = 0;
for (int i = 0; i < inlen; i++)
{
if (in[i] == pre[0])
{
gen = i;
break;
}
}
// 构造左子树的前序遍历结果和中序遍历结果
for (int i = 0; i < gen; i++)
{
left_in.push_back(in[i]); /
left_pre.push_back(pre[i + 1]); //前序第一个为根节点
}
// 构造右子树的前序遍历结果和中序遍历结果
for (int i = gen + 1; i < inlen; i++)
{
right_in.push_back(in[i]);
right_pre.push_back(pre[i]);
}
// 分别挂到根节点的左右子树上
head->left = reConstructBinaryTree(left_pre, left_in);
head->right = reConstructBinaryTree(right_pre, right_in);
// 构造玩本节点的左右子树后,返回本节点,挂在到他的根节点上。
return head;
}
上面是递归的解法,利用了原来的函数。
如果不进行拷贝,传入起始的迭代器的话,那么需要一个额外的递归函数。