106. Construct Binary Tree from Inorder and Postorder Traversal
题目大意
Given two integer arrays inorder
and postorder
where inorder
is the inorder traversal of a binary tree and postorder
is the postorder traversal of the same tree, construct and return the binary tree.
中文释义
给定两个整数数组 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]
限制条件
inorder
的长度范围为1 <= inorder.length <= 3000
。postorder.length == inorder.length
。-3000 <= inorder[i], postorder[i] <= 3000
。inorder
和postorder
包含唯一值。postorder
中的每个值也出现在inorder
中。inorder
保证是树的中序遍历。postorder
保证是树的后序遍历。
解题思路
方法
这是针对“106. Construct Binary Tree from Inorder and Postorder Traversal”问题的解决方案。该方法通过结合中序遍历和后序遍历的数组,构造出原始的二叉树。
-
存储遍历结果:
- 使用两个向量
in_order
和post_order
来存储中序遍历和后序遍历的结果。
- 使用两个向量
-
创建哈希映射:
- 使用一个哈希表
in_map
来存储中序遍历中每个值对应的索引,以便快速定位根节点在中序遍历中的位置。
- 使用一个哈希表
-
递归构建树:
- 实现
buildTree
函数,使用后序遍历的最后一个元素作为根节点。 - 在中序遍历中找到根节点,确定左右子树的边界。
- 递归构建左子树和右子树。
- 实现
-
构建整棵树:
- 在
buildTree
的另一个重载中,初始化in_order
、post_order
和in_map
,然后调用第一个buildTree
函数开始递归。
- 在
代码
class Solution {
public:
vector<int> in_order, post_order;
unordered_map<int, int> in_map;
TreeNode* buildTree(int pStart, int pEnd, int iStart, int iEnd) {
if (pStart > pEnd || iStart > iEnd) return nullptr;
TreeNode* root = new TreeNode(post_order[pEnd]);
int inRoot = in_map[root -> val];
int numsleft = inRoot - iStart;
root -> left = buildTree(pStart, pStart + numsleft - 1, iStart, inRoot - 1);
root -> right = buildTree(pStart + numsleft, pEnd - 1, inRoot + 1, iEnd);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
in_order = inorder;
post_order = postorder;
for (int i = 0; i < inorder.size(); i++) {in_map[inorder[i]] = i;}
return buildTree(0, post_order.size() - 1, 0, inorder.size() - 1);
}
};