中序后序遍历构造二叉树
思路
后序遍历的最后一个元素即为此二叉树的根节点,所以求解过程跟前序中序的过程相似,每次在后序遍历中寻找二叉树的根节点然后在中序中计算子树的长度,递归求解左右子树。
class Solution {
public:
unordered_map<int, int> index;
TreeNode* T(const vector<int>& inorder, const vector<int>& postorder, int il, int ir, int pl, int pr) {
if(pl > pr) return nullptr;
TreeNode* root = new TreeNode(postorder[pr]);
int iroot = index[postorder[pr]];
root->left = T(inorder, postorder, il, iroot - 1, pl, pl + iroot - il - 1);
root->right = T(inorder, postorder, iroot + 1, ir, pl + iroot - il, pr - 1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int len = inorder.size();
for(int i = 0; i < len; i++) index[inorder[i]] = i;
return T(inorder, postorder, 0, len - 1, 0, len - 1);
}
};