根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
首先讲讲思路:就以上面的[9,3,15,20,7] 和 [9,15,7,20,3]为例
- 首先我们根据后续遍历马上就能找出根节点是哪个,因为后续遍历根节点一定是最后那个,所以例题中的根节点就是3了。
- 找到根节点后,马上在中序遍历中根据根节点,可以找出根节点的左节点集合和右节点集合了,例题中的左节点集合一定是9,右节点集合一定是 15 20 7。
- OK接下来就很简单了,我们再根据其左右节点集合按照第一步和第二步进行递归就完事了。
AC解:
class Solution {
public:
TreeNode * buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.size() == 0)
return NULL;
int Now_P;
TreeNode *Res = new TreeNode(postorder[postorder.size() - 1]);
for (int i = 0; i < inorder.size(); i++)
{
if (Res->val == inorder[i])
{
//copy(inorder.begin(), inorder.begin() + i, Left_ino.begin());
//copy(postorder.begin(), postorder.begin() + i, Left_Pos.begin());
//copy(inorder.begin()+i+1, inorder.end(), Right_ino.begin());
//copy(postorder.begin()+1, postorder.end()-1, Right_Pos.begin());
Now_P = i;
break;
}
}
vector<int> Left_ino(inorder.begin(), inorder.begin() + Now_P);
vector<int> Left_Pos(postorder.begin(), postorder.begin() + Now_P);
vector<int> Right_ino(inorder.begin() + Now_P + 1, inorder.end());
vector<int> Right_Pos(postorder.begin() + Now_P, postorder.end() - 1);
TreeNode* Left = buildTree(Left_ino, Left_Pos);
TreeNode* Right = buildTree(Right_ino, Right_Pos);
Res->left = Left;
Res->right = Right;
return Res;
}
};