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

文章介绍了如何优化LeetCode中的二叉搜索树修剪问题,通过分离不同条件减少递归复杂度,并展示了将有序数组转换为二叉搜索树和二叉搜索树转为累加树的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode 669. 修剪二叉搜索树

思路:遇到不符合条件的节点,对其采用和LeetCode450一样的思路进行删除,将两个条件放在一起判断虽然也能通过,但是这种思路会增加递归的复杂度,会做许多无意义的遍历,例如当root.val<low时,即使左子树不为空,也不需要再遍历,因为左子树必然小于root.val;同理,当root.val>high时,右子树是不需要再遍历的,所以需要将这两种情况分开处理。

原始思路代码:

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root == null) return root;
        if(root.val < low || root.val > high) {
            if(root.left == null && root.right != null) return trimBST(root.right, low, high);
            if(root.left != null && root.right != null) {
                TreeNode leftest = transerval(root.right);
                leftest.left = root.left;
                return trimBST(root.right, low, high);
            }
            return trimBST(root.left, low, high);
        }
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
    public TreeNode transerval(TreeNode node) {
        if(node.left == null) return node;
        return transerval(node.left);
    }
}

优化后代码如下:

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root == null) return root;
        if(root.val < low) {
            // 说明当前节点和左子树都不满足[low,hight];
            TreeNode right = trimBST(root.right, low, high);
            return right;
        }
        if(root.val > high) {
            //  说明当前节点和右子树都不满足[low,hight];
            TreeNode left = trimBST(root.left, low, high);
            return left;
        }
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}

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

由于题目要求要将一个有序数组nums转换为一个高度平衡的二叉搜索树,不难想到通过取中点来构造树,这里我才用的区间是左闭右开,后面递归也一直坚持左闭右开。当start == end时,说明该区间内没有节点了,应返回空节点,否则取中点作为当前节点,并递归构造左子树和右子树。这样得到的树便是高度平衡的。代码如下:

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return transerval(nums, 0, nums.length);
    }
    public TreeNode transerval(int[] nums, int start, int end) {
        if(start == end) return null;
        int index = start + (end - start) / 2;
        TreeNode node = new TreeNode(nums[index]);
        node.left = transerval(nums, start, index);
        node.right = transerval(nums, index + 1, end);
        return node;
    }
}

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

本题不难想到右中左来遍历二叉搜索树,记录下前一个节点的值,与当前节点的值相加,便可得到累加树,代码如下:

class Solution {
    int pre = 0;
    public TreeNode convertBST(TreeNode root) {
        transerval(root);
        return root;
    }
    public void transerval(TreeNode node) {
        if(node == null) return ;
        transerval(node.right);
        node.val += pre;
        pre = node.val;
        transerval(node.left);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值