LeetCode刷题day20|654.最大二叉树、617.二叉树的合并、700.二叉搜索树中的搜索、98.验证二叉搜索树

一、654.最大二叉树

这道题与构造二叉树类似。这种需要构造二叉树的题,一般都需要用到前序遍历。
有一个需要注意的点:**在寻找最大节点的时候,记得理清楚要遍历的范围。
以下是代码部分:

//代码随想录的解法
    public TreeNode constructMaximumBinaryTree2(int[] nums) {

        return getNode(nums,0,nums.length);

    }

    private TreeNode getNode(int[] nums, int begin, int end){

        //没有节点了
        if(begin == end)
            return null;

        TreeNode node = new TreeNode();
        //叶子节点
        if(begin == end - 1){
            node.val = nums[begin];
            return node;
        }

        //寻找当前数组最大值
        //踩坑的地方: index 不是从0开始,也不是结束到nums.length
        int index = begin,max = nums[begin];
        for (int i = begin; i < end; i++) {
            if(nums[i] > max){
                index = i;
                max = nums[i];
            }
        }

        node.val = max;
        node.left = getNode(nums, begin, index);
        node.right = getNode(nums, index+1,end);

        return node;

    }

二、617.二叉树的合并

这道题就是通过前序遍历重新构造一个二叉树(当然也可以在先前某个二叉树的基础上修改)
以下是代码部分:

public TreeNode mergeTrees2(TreeNode root1, TreeNode root2) {

     //当某个节点为空时,
     if(root1 == null)
         return root2;
     if(root2 == null)
         return root1;

     //两个节点均有
     root1.val = root1.val + root2.val;      //中
     root1.left = mergeTrees(root1.left , root2.left);
     root1.right = mergeTrees(root1.right, root2.right);

     return root1;
 }

三、700.二叉搜索树中的搜索

这道题就是通过二叉搜索树的特点进行一个遍历,有点类似二分查找。
这里我有一个踩坑的地方:在判断往左遍历还是往右遍历的条件一定要理清楚。
以下是代码部分:

public class 二叉搜索树中的搜索700 {

    public TreeNode searchBST(TreeNode root, int val) {

        if(root == null)
            return null;

        if(root.val == val)
            return root;
        //第一次踩坑了 ——>注意,这里是 大于。或者说 val < root.val
        else if(root.val > val)
            return searchBST(root.left, val);
        else
            return searchBST(root.right, val);
    }
}

四、98.验证二叉搜索树

这道题刚开始做的时候踩了坑,想的只要局部子树符合要求,全局就符合要求。但是这样的想法有问题,例如:[5,4,6,null,null,3,7]
解题的思路:对二叉树进行一次中序遍历,看遍历节点的值是否为升序。
以下是代码部分:

List<Integer> res = new ArrayList<>();
    //利用中序遍历
    public boolean isValidBST2(TreeNode root) {

        if(root == null)
            return false;

        //踩坑:忘记调用中序遍历
        inorder(root);
        for (int i = 1; i < res.size(); i++) {

            //踩坑:1. 这里注意在list中取值的方式         2. 必须是大于等于(即,等于也是不行的)
            if(res.get(i-1) >= res.get(i))
                return false;
        }
        return true;
    }

    private void inorder(TreeNode root){

        if(root == null)
            return;

        inorder(root.left);
        res.add(root.val);
        inorder(root.right);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值