代码随想录算法训练营补打卡 day23 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、 总结篇


代码随想录

669. 修剪二叉搜索树

思路

题解思路:如果当前值小于low,就找右边的节点,如果当前值大于high,就找左边的节点。如果当前值在low和high之间,就继续遍历,最后返回当前节点,不改变树的结构。

代码

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if (root == null) {
            return null;
        }
        if (root.val < low) {
            return trimBST(root.right, low, high);
        }
        if (root.val > high) {
            return trimBST(root.left, low, high);
        }
        // root在[low,high]范围内
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}


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

思路

因为已经是有序数组,所以只需要把中间的值作为根节点,两边挂节点即可。
使用双指针法控制节点移动,每次递归都传入左右指针,以中间节点作为根节点建立二叉树。

代码

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {

        if(nums.length == 0) return null;
        int left = 0;
        int right = nums.length-1;
        int mid = (left+right)/2;
        int mid_left = mid - 1;
        int mid_right = mid + 1;

        TreeNode root = new TreeNode(nums[mid]);
        
        root.left = orderTree(nums,left,mid_left);
        root.right = orderTree(nums,mid_right,right);

        return root;
    }

    TreeNode orderTree(int[] nums, int left, int right) {
        if(left > right ) return null;
        int mid = (left+right)/2;
        int mid_left = mid - 1;
        int mid_right = mid + 1;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = orderTree(nums,left,mid_left);
        root.right = orderTree(nums,mid_right,right);

        return root;

    }
}

问题分析

还可以再简洁一点,第一次的也作为递归翻到递归函数里面去即可。

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

思路

中序遍历,记录一个前节点,这样就能把更大的值累加上去
题解思路:反中序遍历,按照右中左的顺序,这样就能把更大的值累加到小的上面!

代码

class Solution {

    int sum = 0;
    public TreeNode convertBST(TreeNode root) {

        if (root ==null) return null;
   
        root.right = convertBST(root.right);
        sum += root.val;
        root.val = sum;
        root.left = convertBST(root.left);
        
       
        return root;

    }
}

总结篇

遍历的方式:深度(中左右 左中右 左右中 某些情况也可以右左反过来,具体问题具体分析)、广度(层序遍历)

是否有返回值:没有返回值的话,就可以遍历整棵树,当然返回值可以使指向它的左右节点,这样也可以遍历整棵树(具体参考 把二叉树转换为累加树、将有序数组转换为二叉树等)

终值条件:一般当root==null了就返回

主要还是对递归的理解,深度遍历相当于是对树从上到下or从下到上进行了一次搜索。递归到底就是完成了一次任务。

递归三要素:返回值、参数,终止条件,单层逻辑。

遍历顺序的选择:
• 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
• 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
• 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值