代码随想录刷题记录day21 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树

代码随想录刷题记录day21 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树

参考:[代码随想录](

669. 修剪二叉搜索树

代码随想录刷题记录day21 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树_第1张图片

思想

递归终止条件 root==null return null 返回空节点 表示删除

小于low 把右子树的递归结果向上返回

大于high 把左子树的递归结果向上返回

单层左子树去接住左边的递归结果,右子树去接住右边的递归结果

代码

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        //递归终止条件
        if(root==null) return null;
        if(root.val<low){
            //右边可能存在符合要求的节点
            TreeNode right=trimBST(root.right,low,high);
            return right;
        }
        if(root.val>high){
            //左边可能存在符合要求的节点
            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;
    }
}

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

代码随想录刷题记录day21 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树_第2张图片

思想

把一个数组切分成左右两个部分,左右子数组继续递归,实现单层递归内的逻辑,然后向上返回,root.left 和root.right去接住返回值

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

        return traversal(nums,0,nums.length-1);

    }
    public TreeNode traversal(int[] nums,int left,int right){
        //递归终止条件  left=right 的时候还是有意义的
        if(left>right) return null;

        int mid=(right+left)/2;
        //单层递归的逻辑
        TreeNode root=new TreeNode(nums[mid]);
        root.left=traversal(nums,left,mid-1);
        root.right=traversal(nums,mid+1,right);
        return root;
    }
}

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

代码随想录刷题记录day21 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树_第3张图片

思想

把此题应用到数组中容易实现,所以借鉴数组中的解决办法,采用双指针。

pre 指向前一个节点,采用右中左的递归顺序,进行累加

class Solution {
    int pre=0;
    public TreeNode convertBST(TreeNode root) {
        
        traversal(root);
        return root;
    }

    public void traversal(TreeNode node){
        if(node==null) return ;

        traversal(node.right);
        //zhong 
        node.val+=pre;
        pre=node.val;
        traversal(node.left);
    }
}

你可能感兴趣的:(算法,leetcode,数据结构)