输入某二叉树的中序遍历和后序遍历的结果,请重建出该二叉树。
例如如下二叉树
中序:8 4 2 5 1 6 9 3 7
后序:8 4 5 2 9 6 7 3 1
后序的最后一个节点为根节点,在中序遍历中找出根节点,根节点前的所有节点为左子树,根节点后的所有节点为右子树。
定义四个数组分别存放中序遍历、后序遍历的左子树,中序遍历、后序遍历的右子树。
再将两个遍历的左子树作为子问题递归,两个遍历的右子树作为子问题递归。
最后返回根节点。
代码实现如下:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
if (inorder.size() != postorder.size() || inorder.size() == 0)
return NULL;
int root = postorder[postorder.size() - 1];//根节点
int i = 0;
while (!inorder.empty())
{
if (inorder[i] == root)
break;
i++;
}//在中序中找出根节点
vector<int> in_left, in_right, post_left, post_right;
TreeNode* node = new TreeNode(root);
//存放中序遍历、后序遍历的左子树
int j = 0;
while (j < i)
{
in_left.push_back(inorder[j]);
post_left.push_back(postorder[j]);
j++;
}
//存放中序遍历、后序遍历的右子树
j = i;
while (j < postorder.size()-1)
{
in_right.push_back(inorder[j + 1]);
post_right.push_back(postorder[j]);
j++;
}
node->left = buildTree(in_left, post_left);
node->right = buildTree(in_right, post_right);
return node;
}