JZ04 重建二叉树

本文最后更新于:2022年4月9日 中午

image-20211006102423543

Solution

  • 根据索引来划分区间
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
35
36
37
38
39
40
41
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return construct(pre, 0, pre.size()-1, vin, 0, vin.size()-1);
}
private:
TreeNode* construct(const vector<int> pre, int preBegin, int preEnd,
const vector<int> vin, int vinBegin, int vinEnd) {
if (preBegin > preEnd) return nullptr;
TreeNode* root = new TreeNode(pre[preBegin]);
// 在中序数组中寻找切割点
int i;
for (i = vinBegin; i <= vinEnd; ++i) {
if (vin[i] == pre[preBegin]) break;
}

// 切割中序数组
int vinLeftBegin = vinBegin;
int vinLeftEnd = i - 1;
int vinRightBegin = i + 1;
int vinRightEnd = vinEnd;
// 切割前序数组
int preLeftBegin = preBegin + 1;
int preLeftEnd = preLeftBegin + (vinLeftEnd - vinLeftBegin);
int preRightBegin = preLeftEnd + 1;
int preRightEnd = preEnd;

root->left = construct(pre, preLeftBegin, preLeftEnd, vin, vinLeftBegin, vinLeftEnd);
root->right = construct(pre, preRightBegin, preRightEnd, vin, vinRightBegin, vinRightEnd);
return root;
}
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!