二叉树 | Java | LeetCode 669 108 538 做题总结,BST

669. 修剪二叉搜索树

没有思路

思路

确定递归函数的参数以及返回值

根据 701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点 ,可以学到二叉树在构建&修剪的时候,返回值是操作(增删)二叉树的根节点,直接返回给父节点。

把当前子树操作之后符合要求的根节点返回给上一层。

确定终止条件

修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。

if (root == null ) return null;

单层递归的逻辑

① 如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。(为什么呢,因为BST的右子树是比根节点值要大的,可能在[low, height]区间内)。

if (root->val < low) {
    TreeNode right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
    return right;
}

② 如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。(root.val大于high,根据BST的特性,其右子树所有结点的值都比 root.val大,所以只考虑左子树中有可能出现满足要求的节点)

if (root->val > high) {
    TreeNode left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
    return left;
}

③ 如果root(当前节点)的元素在 [left, right] 之间,只是保证了当前节点符合要求,不能保证其左子树或右子树符合要求,所以要对左右子树进行修剪。

root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
return root;

正确解答

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        // trimBST:得到当前root子树修剪完之后的 根节点,并返回
        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.将有序数组转换为二叉搜索树

构建二叉树类的题目 是比较模板化的题,题目之间变化很少。

我想到了要用中间的树作为根节点,但是递归写不出来。不知道要怎么递归构造

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return createBST(nums,0,nums.length-1);
    }

    TreeNode createBST(int[] nums,int low, int high) {
        if(low > high) return null;
        int mid = (low+high)/2;
        TreeNode cur = new TreeNode(nums[mid]);
        cur.left = createBST(nums, low, mid-1);
        cur.right = createBST(nums, mid+1, high);
        return cur;
    }
}

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

能想到右中左遍历
刚开始看题目不知道要干什么,是看图猜出来的从右下加到左下

思路:从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。本题需要一个pre指针(全局变量,而且本题可以只记录节点的数值)记录当前遍历节点cur的前一个节点,这样才方便做累加。

双指针有点晕。。

class Solution {
    int sum; //pre指针指向节点的值

    public TreeNode convertBST(TreeNode root) {
        sum=0;
        traversal(root);
        return root;
    }
    void traversal(TreeNode root) {
        if(root == null) return;

        traversal(root.right);
        sum += root.val;
        root.val = sum;
        traversal(root.left);
    }
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值