@@ -63,7 +63,7 @@ if (nums.size() == 1) {
|
||||
|
||||
这里有三步工作
|
||||
|
||||
1. 先要找到数组中最大的值和对应的下表, 最大的值构造根节点,下表用来下一步分割数组。
|
||||
1. 先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。
|
||||
|
||||
代码如下:
|
||||
```CPP
|
||||
@@ -79,7 +79,7 @@ TreeNode* node = new TreeNode(0);
|
||||
node->val = maxValue;
|
||||
```
|
||||
|
||||
2. 最大值所在的下表左区间 构造左子树
|
||||
2. 最大值所在的下标左区间 构造左子树
|
||||
|
||||
这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值。
|
||||
|
||||
@@ -91,7 +91,7 @@ if (maxValueIndex > 0) {
|
||||
}
|
||||
```
|
||||
|
||||
3. 最大值所在的下表右区间 构造右子树
|
||||
3. 最大值所在的下标右区间 构造右子树
|
||||
|
||||
判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值。
|
||||
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
node->val = nums[0];
|
||||
return node;
|
||||
}
|
||||
// 找到数组中最大的值和对应的下表
|
||||
// 找到数组中最大的值和对应的下标
|
||||
int maxValue = 0;
|
||||
int maxValueIndex = 0;
|
||||
for (int i = 0; i < nums.size(); i++) {
|
||||
@@ -124,12 +124,12 @@ public:
|
||||
}
|
||||
}
|
||||
node->val = maxValue;
|
||||
// 最大值所在的下表左区间 构造左子树
|
||||
// 最大值所在的下标左区间 构造左子树
|
||||
if (maxValueIndex > 0) {
|
||||
vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);
|
||||
node->left = constructMaximumBinaryTree(newVec);
|
||||
}
|
||||
// 最大值所在的下表右区间 构造右子树
|
||||
// 最大值所在的下标右区间 构造右子树
|
||||
if (maxValueIndex < (nums.size() - 1)) {
|
||||
vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());
|
||||
node->right = constructMaximumBinaryTree(newVec);
|
||||
@@ -141,7 +141,7 @@ public:
|
||||
|
||||
以上代码比较冗余,效率也不高,每次还要切割的时候每次都要定义新的vector(也就是数组),但逻辑比较清晰。
|
||||
|
||||
和文章[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。
|
||||
和文章[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下标索引直接在原数组上操作。
|
||||
|
||||
优化后代码如下:
|
||||
|
||||
@@ -152,7 +152,7 @@ private:
|
||||
TreeNode* traversal(vector<int>& nums, int left, int right) {
|
||||
if (left >= right) return nullptr;
|
||||
|
||||
// 分割点下表:maxValueIndex
|
||||
// 分割点下标:maxValueIndex
|
||||
int maxValueIndex = left;
|
||||
for (int i = left + 1; i < right; ++i) {
|
||||
if (nums[i] > nums[maxValueIndex]) maxValueIndex = i;
|
||||
@@ -212,7 +212,7 @@ root->right = traversal(nums, maxValueIndex + 1, right);
|
||||
|
||||
这道题目其实和 [二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 是一个思路,比[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 还简单一些。
|
||||
|
||||
**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。**
|
||||
**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。**
|
||||
|
||||
一些同学也会疑惑,什么时候递归函数前面加if,什么时候不加if,这个问题我在最后也给出了解释。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user