代码随想录day23 | 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树
669. 修剪二叉搜索树
思路:迭代
1.找到在范围内的第一个节点,设置为根节点
2.对左子树进行遍历,如果左子节点的值小于low,那么将左子节点的右子树作为新的左子节点
3.对右子树进行遍历,如果右子节点的值大于high,那么将右子节点的左子树作为新的右子节点
实现
点击查看代码
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
while(root && (root->val < low || root->val > high)) {
if(root->val < low) root = root->right;
else root = root->left;
}
TreeNode* temp = root;
while(temp != nullptr) {
while(temp->left && temp->left->val < low) {
temp->left = temp->left->right;
}
temp = temp->left;
}
temp = root;
while(temp != nullptr) {
while(temp->right && temp->right->val > high) {
temp->right = temp->right->left;
}
temp = temp->right;
}
return root;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
108. 将有序数组转换为二叉搜索树
思路
因为二叉树的按照有序排列,因此根节点的值为中间值,那么我们只需要找到中间值,建立根节点,并将数组分为左右区间。根据左右区间继续建造左子树和右子树。
实现
点击查看代码
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
return traversal(nums, left, right);
}
TreeNode* traversal(vector<int>& nums, int left, int right) {
if(left > right) return nullptr;
int mid = left + (right-left)/2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid-1);
root->right = traversal(nums, mid+1, right);
return root;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(logn),栈开销
538. 把二叉搜索树转换为累加树
思路:中序遍历
遍历顺序为右中左,不断叠加即可
实现
点击查看代码
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
traversal(root,sum);
return root;
}
int sum = 0;
void traversal(TreeNode* root, int& sum) {
if(root == nullptr) return;
traversal(root->right, sum);
sum += root->val;
root->val = sum;
traversal(root->left, sum);
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
语言问题
传入指针实际上也是一种值传递,我们可以改变指针所指的值,但是却无法改变指针本身的值,即使指针指向另一个值。




浙公网安备 33010602011771号