算法练习 Day20 | leetcode 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

一、算法题

654.最大二叉树

题目链接

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        if(nums.length==0){
            return null;
        }
        return maxtree(nums,0,nums.length);
    }
    public TreeNode maxtree(int[] nums,int leftIndex,int rightIndex){
        if(leftIndex>=rightIndex){
            return null;
        }
        int max=Integer.MIN_VALUE;
        int maxIndex=0;
        //找到数组中最大值
        for (int i = leftIndex; i < rightIndex; i++) {
            if(nums[i]>max){
                max=nums[i];
                maxIndex=i;
            }
        }
        TreeNode root=new TreeNode(max);
        root.left=maxtree(nums, leftIndex, maxIndex);
        root.right=maxtree(nums, maxIndex+1, rightIndex);
        return root;
    }
}
  • 终止条件
if(leftIndex>=rightIndex){
    return null;
 }
  • 不能用判断数组长度来作为终止条件,因为数组是不变的,改变的是我们传入的下标,它只会通过下标取对应的数组元素
  • 取等于是因为当左右下标相同时
    • 不可能出现一开始就左右下标相同的情况,因为一开始leftIndex=0且rightIndex=0,这样只有空数组才有这样的情况。不可能传入空数组,因为一开始就判断了,所以出现左右下标相同一定是在递归过程中出现的
    • 因为leftIndex其实一直是0,当rightIndex(在递归过程中其实是maxIndex)与leftIndex相等时,说明最左边的元素就是最大的元素,这个最大元素在上一层递归中就已经被new成结点的了,所以返回null退出此次循环
  • 遍历树一般想到前序遍历

617.合并二叉树

题目链接

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1==null){
            return root2;
        }
        if(root2==null){
            return root1;
        }
        root1.val+=root2.val;
        root1.left=mergeTrees(root1.left, root2.left);
        root1.right=mergeTrees(root1.right, root2.right);
        return root1;
    }
}
  • 在root1的基础上修改树
  • 同时操作两个树就同时传入两个树一起递归

700.二叉搜索树中的搜索

题目链接

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if(root==null||root.val==val){
            return root;
        }

        TreeNode left=searchBST(root.left, val);
        if(left!=null){
            //说明找到了
            return left;
        }

        TreeNode right=searchBST(root.right, val);
        if(right!=null){
            //说明找到了
            return right;
        }
        //左右结点都没找到
        return null;
    }
}

98.验证二叉搜索树

题目链接

class Solution {
    long maxvalue=Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if(root==null){
            return true;
        }
        boolean left=isValidBST(root.left);
        if(root.val>maxvalue){
            maxvalue=root.val;
        }
        else{
            //此时root.val<maxvalue,也就是出现了中间结点的值比左子节点的值要小的情况
            return false;
        }
        boolean right=isValidBST(root.right);
        return left&&right;
    }
}
  • 遇到搜索树要想到中序遍历
  • maxvalue要定义在isValidBST外
  • 不然每次递归遇到的maxvalue全是重新定义的,等于Long.MIN_VALUE的值
  • 这样什么情况都会返回true
  •  这里的root.val其实是根据中序遍历的左中右顺序的结点的值,maxvalue是它按这个顺序的上一个的值,所以如果是搜索树的话,每次递归的结点的值要比上一次递归取到的最大值要大
if(root.val>maxvalue){
    maxvalue=root.val;
}

  • 比如[2,1,3]
  • root.val=1,大于maxvalue初始值,此时更新maxvalue=1
  • root.val=2,大于maxvalue,此时更新maxvalue=2
  • root.val=3,大于maxvalue,此时更新maxvalue=3
  • 所以最后返回true

 

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值