根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
解题思路:
与Leetcode105.从中序与先序遍历序列构造二叉树思路类似,请查看105题的解题思路,链接如下。
https://blog.youkuaiyun.com/qq_23523409/article/details/84035266
不同之处是,后续遍历的数组最后一个是根结点,理根结点近的是右子树,除此之外是左子树。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { int size_in = inorder.size(), size_post = postorder.size(); if (size_in == 0 || size_post == 0) return NULL; in = inorder; post = postorder; for (int i = 1; i <= size_in; i++) { mp[inorder[i - 1]] = i - 1; } TreeNode* root = build(0, size_in, 0, size_post); return root; } TreeNode* build(int in_first, int in_last, int post_first, int post_last) { if (in_first == in_last || post_first == post_last) return NULL; if (in_first + 1 == in_last || post_first + 1 == post_last) return new TreeNode(post[post_first]); int pos = mp[post[post_last - 1]]; TreeNode* root = new TreeNode(post[post_last - 1]); root->left = build(in_first, pos, post_first, post_last - 1 - (in_last - pos - 1)); root->right = build(pos + 1, in_last, post_last - 1 - (in_last - pos - 1), post_last - 1); return root; } private: vector<int> in, post; unordered_map<int, int> mp; }; |