day19修建二叉搜索树&将有序数组转为二叉搜索树&把二叉搜索树转为累加树(递归三部曲&二叉树的总结图)

        今天结束二叉树题目,感觉最二叉树的属性及操作更深刻了。

1.力扣669(修建二叉搜索树)

        

         本题是给出范围,也就是二叉搜索树根据这个范围来除去不符合的节点,又因为本题是二叉搜索树所以使用中序遍历,若遍历到不符合范围的节点时,直接跳过本节点并递归遍历。下面时递归三部曲:

  • 确定递归函数的参数以及返回值:我们需要返回根节点,所以本题我们返回节点。
    public TreeNode trim(TreeNode root, int low, int high)
  • 确定终止条件:修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
        if(root==null){
            return null;
        }
  • 确定单层递归的逻辑:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点;有边界同理。
        if(root.val<low){
            return trim(root.right,low,high);
        }
        if(root.val>high){
            return trim(root.left,low,high);
        }
        root.left = trim(root.left,low,high);
        root.right = trim(root.right,low,high);
        return root;

整体代码如下:

    public TreeNode trimBST(TreeNode root, int low, int high) {
        return trim(root,low,high);
    }

    public TreeNode trim(TreeNode root, int low, int high) {
        if(root==null){
            return null;
        }
        if(root.val<low){
            return trim(root.right,low,high);
        }
        if(root.val>high){
            return trim(root.left,low,high);
        }
        root.left = trim(root.left,low,high);
        root.right = trim(root.right,low,high);
        return root;
    }

2.力扣108(将有序数组转为二叉搜索树)

       

 

         本题需要我们构建二叉树,所以我们采用前序遍历,构建好根节点后,我们递归遍历二叉树;本题有个特殊的地方,我们需要构建出高度平衡的二叉树,所以我们这里取得时数组得中间值,这样可以保证构建出来得节点高度不可能超过一。下面是递归三部曲:

  • 确定递归函数返回值及其参数:首先是传入数组,然后就是左下标left和右下标right,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。
    public TreeNode sorted(int[] nums,int left,int right)
  • 确定递归终止条件:这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。
        if(left>right){
            return null;
        }
  • 确定单层递归的逻辑:我们取mid = (right+left)/2,也就是数组长度为奇数取中间值,为偶数时,我们取左边得值。然后再递归构建左右子树。
        int mid = (left+right)/2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = sorted(nums,left,mid-1);
        node.right = sorted(nums,mid+1,right);
        return node;

整体代码:

    public TreeNode sortedArrayToBST(int[] nums) {
        return sorted(nums,0,nums.length-1);
    }
    public TreeNode sorted(int[] nums,int left,int right) {
        if(left>right){
            return null;
        }
        int mid = (left+right)/2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = sorted(nums,left,mid-1);
        node.right = sorted(nums,mid+1,right);
        return node;
    }

3.力扣538(把二叉搜索树转为累加树)

       

 

         本题利用双指针来解决可以充分利用二叉搜索树的特性,因为我们要求累加树,我们先遍历右中左的遍历顺序会非常好解决,当我们遍历至二叉树的最右端时,我们重新赋值节点的值为pre+root.val,然后记录pre的值。下面时递归三部曲:

  • 递归函数参数以及返回值:这里很明确了,不需要递归函数的返回值做什么操作了,要遍历整棵树。同时需要定义一个全局变量pre,用来保存cur节点的前一个节点的数值,定义为int型就可以了。
    public TreeNode convert(TreeNode root) 
  • 确定终止条件:遇空就终止。
        if(root==null){
            return null;
        }
  • 确定单层递归的逻辑:注意要右中左来遍历二叉树, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。
        convert(root.right);
        root.val+=pre;
        pre = root.val;
        convert(root.left);
        return root;

整体代码:

    int pre = 0;
    public TreeNode convertBST(TreeNode root) {
        return convert(root);
    }
    public TreeNode convert(TreeNode root) {
        if(root==null){
            return null;
        }
        convert(root.right);
        root.val+=pre;
        pre = root.val;
        convert(root.left);
        return root;
    }

附上大佬的二叉树的总结图:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值