目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
描述:
给定两个整数数组 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
保证是树的后序遍历
解题思路:
1.和105题差不多,只不过后序遍历的最后一个数字,一定是根节点。中序遍历中找到这个根节点,就可以分成左右两份,分别对应左子树和右子树。
2.所以我们使用和105题一样的策略,唯一要改的就是传入的区间范围。
代码:
/**
* 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 {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
vector<int> indexMap(6000);
for (int i = 0; i < inorder.size(); i++)
{
indexMap[inorder[i] + 3000] = i;
}
TreeNode *node = buildNode(indexMap, postorder, inorder, 0, postorder.size() - 1, 0, inorder.size() - 1);
return node;
}
TreeNode *buildNode(vector<int> &indexMap, vector<int> &postorder, vector<int> &inorder, int postStart, int postEnd, int inStart, int inEnd)
{
int expectValue = postorder[postEnd];
int index = indexMap[expectValue+3000];
int leftLength = index - inStart;
int rightLength = inEnd - index;
TreeNode *root = new TreeNode(expectValue);
if (leftLength >= 1)
{
root->left = buildNode(indexMap, postorder, inorder, postStart, postStart + leftLength - 1, inStart, index - 1);
}
if (rightLength >= 1)
{
root->right = buildNode(indexMap, postorder, inorder, postEnd - rightLength, postEnd - 1, index + 1, inEnd);
}
return root;
}
};