代码随想录刷题记录day18之 最大二叉树+合并二叉树+搜索二叉搜索树中的值+验证二叉树

代码随想录刷题记录day18之 最大二叉树+合并二叉树+搜索二叉搜索树中的值+验证二叉树

参考:代码随想录

654. 最大二叉树

在这里插入图片描述

思想

和昨天的根据中序后序构造二叉树 、 根据前序中序构造二叉树的题目很像

按照题目中的描述的思路来写代码就好了

代码
class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return binaryTree(nums);
    }

    public TreeNode binaryTree(int[] nums){
        if(nums.length==0){
            return null;
        }


        //单层递归逻辑
        //找到nums的最大值 根据最大值去切分 左子树和右子树
        int maxValueIndex=0;
        int maxValue=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]>maxValue){
                maxValue=nums[i];
                maxValueIndex=i;
            } 
        }
        // System.out.println("最大值:"+maxValue);
        // System.out.println("最大值下标:"+maxValueIndex);

        TreeNode root=new TreeNode(maxValue);

        //切分左子树和右子树

        int [] leftNums=Arrays.copyOfRange(nums,0,maxValueIndex);
        // System.out.println(Arrays.toString(leftNums));
        int [] rightNums=Arrays.copyOfRange(nums,maxValueIndex+1,nums.length);
        // System.out.println(Arrays.toString(rightNums));

        root.left=binaryTree(leftNums);
        root.right=binaryTree(rightNums);

        return root;

    }
}

617. 合并二叉树

在这里插入图片描述

思想

刚开始想不到终止条件是啥,看了视频才知道。

终止条件: 当node1为空的时候 返回node2;当node2为空的时候返回node1

那node1和node2都为空的时候呢? 其实已经包含进去了,都为空 返回null

单层递归的逻辑:

这是后node1和node2都不为空了 执行相加的操作即可

代码
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        //采用前序遍历
        return merge(root1,root2);
    }

    public TreeNode merge(TreeNode node1,TreeNode node2){
        //递归的终止条件
        if(node1==null) return node2;
        if(node2==null) return node1;
        //代码执行到这一步  肯定是两个节点都不为空的情况了
        
       
        TreeNode root=new TreeNode(node1.val+node2.val);
        

        
        root.left=merge(node1.left,node2.left);//数值可以和null 相加吗?
        root.right=merge(node1.right,node2.right);

        return root;

    }
}

700. 二叉搜索树中的搜索

在这里插入图片描述

思想

自己没想到二叉搜索树的特性。刚开始用前序遍历去做这道题目了,可能递归的次数会多一点。

其实根据二叉搜索树的特性,中序遍历时能够从小到大遍历的

注意时返回值

代码
class Solution {
    // public TreeNode searchBST(TreeNode root, int val) {
    //     //递归终止条件
    //     if(root==null) return null;

    //     //单层递归逻辑
    //     //前序遍历
    //     if(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;

    // }

    public TreeNode searchBST(TreeNode root, int val) {
        //递归终止条件
        if(root==null) return null;

        //单层递归逻辑
        //中序遍历
        

        TreeNode left=searchBST(root.left,val);
        if(left!=null) return left;

        if(root.val==val) return root;

        TreeNode right=searchBST(root.right,val);
        if(right!=null) return right;
        return null;

    }

}

98. 验证二叉搜索树

在这里插入图片描述

思想

这道题目对我来说比较难,没有想到怎么做。

总体思路如下:

首先是根据二叉搜索树的特性 进行中序遍历,维护一个指针指向前一个节点,通过比较前一个节点的值和当前节点的值,来判断是否是符合条件的。

终止条件:

节点为空的时候返回值是什么呢?true 为什么? 因为空节点是二叉搜索树

单层递归的逻辑

需要特殊处理第一个节点,遍历到第一个节点是, pre为空 这时候无法比较,if内的逻辑不执行,直接将当前节点的值赋值给pre

代码
class Solution {
    TreeNode pre=null;
    public boolean isValidBST(TreeNode root) {
        //递归终止条件  是父节点
        if(root==null) return true;//空节点 是二叉搜索树

        //单层递归的逻辑  根据二叉搜索树的特性 中序遍历 是单调递增的
        //左的逻辑
        boolean left=isValidBST(root.left);

        //双指针法  用一个 TreeNode 去记录前一个的节点
        if(pre!=null && root.val<=pre.val){
            //这里的处理 把第一个节点考虑进去了
            //第一个节点 pre为null  就不会进展这里的判断
            //当时第二个节点的时候才开始进行判断
            return false;
        }
        pre=root;

        boolean right=isValidBST(root.right);

        return left&&right;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值