1 題目:從中序與后序遍歷序列構造二叉樹
官方標定難度:中
給定兩個整數數組 inorder 和 postorder ,其中 inorder 是二叉樹的中序遍歷, postorder 是同一棵樹的后序遍歷,請你構造并返回這顆 二叉樹 。
示例 1:
輸入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
輸出:[3,9,20,null,null,15,7]
示例 2:
輸入:inorder = [-1], postorder = [-1]
輸出:[-1]
提示:
1 <= inorder.length <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
inorder 和 postorder 都由 不同 的值組成
postorder 中每一個值都在 inorder 中
inorder 保證是樹的中序遍歷
postorder 保證是樹的后序遍歷
2 solution
后序遍歷的最后一個節點為根節點,從中序遍歷中找到該根節點,根節點左右兩邊分別是左右子樹,遞歸進行進去就可以重建該二叉樹。
代碼
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {vector<int> in;vector<int> post;TreeNode *buildTree(int r, int rr, int n) {if(n == 0) return nullptr;auto *node = new TreeNode(post[rr]);int pos = find(in.begin(), in.end(), post[rr]) - in.begin();int rn = r - pos; node->left = buildTree(pos - 1, rr - rn - 1, n - rn - 1);node->right = buildTree(r, rr - 1, rn);return node;}public:TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {in = inorder;post = postorder;return buildTree(inorder.size() - 1, inorder.size() - 1, inorder.size());}
};