代码随想录day23 | 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

669. 修剪二叉搜索树

题目|文章
image

思路:迭代

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. 将有序数组转换为二叉搜索树

题目|文章
image

思路

因为二叉树的按照有序排列,因此根节点的值为中间值,那么我们只需要找到中间值,建立根节点,并将数组分为左右区间。根据左右区间继续建造左子树和右子树。

实现

点击查看代码
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. 把二叉搜索树转换为累加树

题目|文章
image

思路:中序遍历

遍历顺序为右中左,不断叠加即可

实现

点击查看代码
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)

语言问题

传入指针实际上也是一种值传递,我们可以改变指针所指的值,但是却无法改变指针本身的值,即使指针指向另一个值。

posted @ 2022-10-27 19:09  缩地  阅读(20)  评论(0)    收藏  举报