题目:输入一棵二叉树的前序遍历结果和后序遍历结果,请重建二叉树
例如:
前序遍历:3 9 10 20 15 7
后序遍历:10 9 3 15 20 7
则二叉树为:3
/ \
9 20
/ / \
10 15 7
思路:前序遍历的第一个元素是二叉树的根结点,找到根结点在后续遍历中的位置
那么在后续遍历数组中位于根结点左边的即为根结点的左子树的中序遍历结果,位于根结点右边的即为根结点的右子树的中序遍历结果。
class Solution {
public:
map<int, int> pos;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for (int i = 0; i < n; i++)
pos[inorder[i]] = i;
return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
}
TreeNode* dfs(vector<int>&pre, vector<int>&in, int pl, int pr, int il, int ir)
{
if (pl > pr) return NULL;
int k = pos[pre[pl]] - il;
TreeNode* root = new TreeNode(pre[pl]);
root->left = dfs(pre, in, pl + 1, pl + k, il, il + k - 1);
root->right = dfs(pre, in, pl + k + 1, pr, il + k + 1, ir);
return root;
}
};