1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
class Solution
{
public:
std::unordered_map<int, int> hash; // 记录中序遍历中每个节点值的位置
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{
// 构建哈希表,快速查找中序遍历中每个节点的位置
for (int i = 0; i < inorder.size(); ++i)
hash[inorder[i]] = i;
// 调用递归函数构造二叉树
return build(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
}
TreeNode* build(std::vector<int>& inorder, std::vector<int>& postorder, int il, int ir, int pl, int pr)
{
// 如果子树范围为空,返回空节点
if (il > ir)
return nullptr;
// 获取当前子树的根节点
TreeNode* root = new TreeNode(postorder[pr]);
int mid = hash[root->val]; // 在中序遍历中找到根节点的位置
// 递归构造左子树
root->left = build(inorder, postorder, il, mid - 1, pl, pl + mid - 1 - il);
// 递归构造右子树
root->right = build(inorder, postorder, mid + 1, ir, pl + mid - 1 - il + 1, pr - 1);
return root;
}
};
|