您现在的位置是:首页 >技术杂谈 >代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树网站首页技术杂谈

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

TORE007 2024-06-17 10:14:38
简介代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录

669. 修剪二叉搜索树

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

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


669. 修剪二叉搜索树

这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。

题目链接/文章讲解: 代码随想录

题解思路:

多听卡哥视频讲解思路!!!自己肯定想不出来这么清晰的思路,然后多看把思路记在心里就好!!!!本题注意的是:根据二叉搜索树的特性,当节点的值小于low值时,需要对右子树的节点进行判断;当节点的值大于high值时,需要对左子树的节点进行判断!!!然后就是代码会一直对不符合区间的节点进行处理,如果遇到的节点符合区间值,最后也会一直遍历到root值为null值时,返回null值结束的。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root == null) return null;

        //中:节点的值小于low值考虑右子树
        if(root.val < low){ //如果遍历的节点值小于最小值,根据二叉搜索树的特性,则其左子树一定会小于最小值,直接考虑右子树的节点值是否有大于最小值的节点
            TreeNode right = trimBST(root.right,low,high); //
            return right; //如果右子树上的所有节点也不满足区间内的值,则最后是以遍历到右子树的root为null值时,最终也会返回null值的
        }
        //中:节点的值大于high值考虑左子树
        if(root.val > high){ //如果遍历的节点大于最大值,根据二叉搜索树的特性,则其右子树一定会大于最大值,直接考虑左子树的节点值是否小于最大值的节点
            TreeNode left = trimBST(root.left,low,high);
            return left; //如果左子树上的所有节点也不满足区间内的值,则最后也是以遍历左子树的root为null值时,最终也会返回null值
        }
        root.left = trimBST(root.left,low,high);//左 当遍历的节点符合区间值会一直遍历下去,直到遍历的节点root为null值时,也会也会null值
        root.right = trimBST(root.right,low,high);//右 当遍历的节点符合区间值会一直遍历下去,直到遍历的节点root为null值时,也会也会null值
        return root; 

    }
}

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

本题就简单一些,可以尝试先自己做做。

题目链接/文章讲解:代码随想录

题解思路:

多听卡哥思路讲解!!!本题关键在于不断的平等的分割左右数组,然后构建二叉树,这样基于分割后的数组构建的二叉树一定是平衡二叉树,而所给的数组已经是排好序的数组了,那么基于此数组构建的一定是二叉搜索树,所以一开始拿到题目不用很慌,觉得很难题解!!!一定要多看卡哥视频,多听,多看,多想,多刷就好!!!还有就是编写代码时一定要确定好(比如左闭右闭)原则去进行分析,否则分析的时候会很混乱的

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBST(nums, 0, nums.length - 1);
    }
    
    //左闭右闭原则
    public TreeNode sortedArrayToBST(int[] nums, int begin, int end){
        if(begin > end) return null;
        int middle = (end - begin)/2 + begin; 
        TreeNode root = new TreeNode(nums[middle]);
        root.left = sortedArrayToBST(nums, begin, middle -1);
        root.right = sortedArrayToBST(nums, middle + 1, end);
        return root;
    }
}

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

本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。

题目链接/文章讲解:代码随想录

题解思路:
看题解好简单,自己写一团糟,不知道为什么会这样!!!就是说自己想的牛头不对马嘴就很离谱了

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
        int sum = 0;
    public TreeNode convertBST(TreeNode root) {
        if(root == null) return null;
        convertBST(root.right);
        sum += root.val;
        root.val = sum;
        convertBST(root.left);
        return root;
    }
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。