leetcode刷题day20|二叉树Part08(669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)

669. 修剪二叉搜索树

思路:理解了删除二叉搜索树中的节点,这个题理解起来就不难了。
还是选用中序遍历递归。

递归三步曲:
1、传入参数:根节点,最小值,最大值;返回值为根节点;
2、终止条件:如果节点为空,直接返回空;
3、递归逻辑:如果最小值小于该节点,递归调用该节点的右孩子(检查右孩子中是否有不符合条件的进行移除)并返回;如果最大值大于该节点,递归调用该节点的左孩子(检查左孩子中是否有不符合条件的进行移除)并返回;用当前节点的左孩子接收递归调用该节点的左孩子;用当前节点的右孩子接收递归调用该节点的右孩子。

移除的逻辑不太好理解,需要多思考
代码如下:

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.left=trimBST(root.left,low,high);
        root.right=trimBST(root.right,low,high);
        return root;
    }
}

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

思路:本题的本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。区间仍然是左闭右开区间。

递归三步曲:
1、传入参数:数组,start,end,根节点;返回值为根节点。
2、终止条件:如果start大于等于end说明区间中无节点了,返回null;
3、递归函数逻辑:找到中间节点(start+end)/2+1;建立root;递归调用得到root.left;递归调用得到root.right;返回root。

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

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

思路:从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加。定义两个全局变量,一个记录总和的变量,一个指向前一个节点的指针。

递归三步曲:
1、传入参数:传入根节点,返回根节点。
2、终止条件:如果节点为空,返回空。
3、递归函数逻辑:递归调用右孩子;sum加上pre赋值给当前节点,将当前节点的值赋值给pre;递归调用左孩子。

递归代码如下:

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值