106. 从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树
给定两个整数数组
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 <= 3000postorder.length == inorder.length-3000 <= inorder[i], postorder[i] <= 3000inorder和postorder都由 不同 的值组成postorder中每一个值都在inorder中inorder保证是树的中序遍历postorder保证是树的后序遍历
解题思路:
根据中序遍历节点值和位置索引的map可以快速找到子树根节点的位置,结合中序和后序数组的边界可以找到左右子树的范围

1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 unordered_map<int, int> map; // key->根节点值,value->根节点位置索引 15 TreeNode *dfs(vector<int> &inorder, vector<int> &postorder, int iLeft, int iRight, int pLeft, int pRight) { 16 if (iLeft > iRight || pLeft > pRight) { 17 return nullptr; 18 } 19 int k = map[postorder[pRight]] - iLeft; 20 TreeNode *subRoot = new TreeNode(postorder[pRight]); 21 subRoot->left = dfs(inorder, postorder, iLeft, iLeft + k - 1, pLeft, pLeft + k - 1); 22 subRoot->right = dfs(inorder, postorder, iLeft + k + 1, iRight, pLeft + k, pRight - 1); 23 return subRoot; 24 } 25 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { 26 if (inorder.empty() || postorder.empty()) { 27 return nullptr; 28 } 29 if (inorder.size() != postorder.size()) { 30 return nullptr; 31 } 32 for (unsigned int i = 0; i < inorder.size(); i++) { 33 map[inorder[i]] = i; 34 } 35 return dfs(inorder, postorder, 0, inorder.size() -1, 0, postorder.size() - 1); 36 } 37 };
浙公网安备 33010602011771号