LeetCode Daily Question 29

5 月 14 日 每日一题


105. Construct Binary Tree from Preorder and Inorder Traversal

Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree.

1
2
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

思路

本题使用递归的写法,首先思考递归公式:

  1. 将 preoder 的局部第一位设为 root(left 区域的第一个 preorder 或 right 区域的第一个 preoder,因此需要一个 prestart 参数)。
  2. 找到该 preorder element 在 inorder 中的 index。
  3. 针对该 preorder element 的 left 区域进入子问题(因此需要 instart 和 inEnd 参数)。
  4. 针对该 preoder element 的 right 区域进入子问题。

第二步思考临界条件:
prestart >= preorder.size() || instart > inend 时返回 nullptr(无 node)

第三步实现代码。

代码

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
/**
* 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:
unordered_map<int, int> index;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
for(int i = 0; i < inorder.size(); i++){
index[inorder[i]] = i;
}
return buildHelper(preorder, inorder, 0, 0, int(inorder.size() - 1), index);
}
TreeNode* buildHelper(vector<int>& preorder, vector<int>& inorder, int preStart, int inStart, int inEnd, unordered_map<int, int> &index){
if(preStart >= preorder.size() || inStart > inEnd)
return nullptr;
TreeNode *root = new TreeNode{preorder[preStart], nullptr, nullptr};
int curIndex = index[preorder[preStart]];
root->left = buildHelper(preorder, inorder, preStart + 1, inStart, curIndex - 1, index);
root->right = buildHelper(preorder, inorder, preStart + curIndex - inStart + 1, curIndex + 1, inEnd, index);
return root;
}
};
  1. 5 月 14 日 每日一题
    1. 105. Construct Binary Tree from Preorder and Inorder Traversal
    2. 思路
    3. 代码