代码随想录算法训练营第二十三天 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

669.修剪二叉搜索树

题目链接 文章讲解 视频讲解

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root == nullptr) return nullptr;
        // 当前值小于左边界时,当前节点的左子树全部小于左边界,所以全部删除,直接处理右子树
        if(root->val < low) {
            // 返回右子树的新根节点
            return trimBST(root->right, low, high);
        }
        // 当前值大于右边界时,当前节点的右子树全部大于有边界,所以全部删除,直接处理左子树
        if(root->val > high) {
            // 返回左子树的新根节点
            return trimBST(root->left, low, high);
        }
        root->left = trimBST(root->left, low, high);
        root->right = trimBST(root->right, low, high);
        return root;
    }
};

将有序数组转换为二叉搜索树

题目链接 文章讲解 视频讲解

思路:二分法划分区间,将中间节点作为当前节点,左区间挂在左子树,右区间挂在右子树,保证二叉树有序平衡

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* root;
        root = binaryFind(nums, 0, nums.size());
        
        return root;
    }
    TreeNode* binaryFind(vector<int>& nums, int left, int right) {
        if(left < right) {
            int mid = ((right - left) >> 1) + left;
            TreeNode* node = new TreeNode(nums[mid]);
            node->left = binaryFind(nums, left, mid);
            node->right = binaryFind(nums, mid + 1, right);
            return node;
        }
        return nullptr;
    }
};

538.把二叉搜索树转换为累加树

题目链接 文章讲解 视频讲解

此题的关键在于遍历顺序,以右中左的顺序遍历并逐渐累加结果即可

class Solution {
public:
    TreeNode* convertBST(TreeNode* root) {
        int count = 0;
        traversal(root, count);
        return root;
    }

    void traversal(TreeNode* root, int& count) {
        if(root == nullptr) return ;
        traversal(root->right, count); // 中序遍历右子树
        count += root->val;  // 累加结果
        root->val = count;
        traversal(root->left, count); // 中序遍历左子树
    }
};
posted @ 2024-06-03 21:35  深蓝von  阅读(1)  评论(0编辑  收藏  举报