刷题10.31

1 最大二叉树

题目

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

代码

class Solution {
    Map map;
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        map=new HashMap<>();
        for(int i=0;imax){
                max=nums[i];
                maxIndex=i;
            }
        }
        TreeNode root=new TreeNode(max);
        root.left=find(nums,begin,maxIndex);
        root.right=find(nums,maxIndex+1,end);
        return root;
    }
}

总结

第一遍提交错误,原因竟然是我再找最大值的时候,i指的是元素小标,可是我条件写的是i<数组个数(end-begin),这也太不认真了

2 合并二叉树

题目

给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始

代码

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;
    }
}

总结

递归写起来,代码好简洁。
偷懒一下,迭代就不写了。

3 二叉搜索树中的搜索

题目

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

代码

//递归
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if( root==null || root.val==val) return root;
        if(root.left==null && root.right==null) return null;
        if(root.val>val){
            TreeNode left=searchBST(root.left,val);
            if(left!=null) return left;
        }
        else{
            TreeNode right=searchBST(root.right,val);
            if(right!=null) return right;
        }
        return null;
    }
}
//迭代
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        while(root!=null){
            if(root.val>val) root=root.left;
            else if(root.val

总结

迭代比递归代码简单,主要还是二叉搜索树的特点。
刚开始看题目,我当然没有注意到二叉搜索树的特点,就直接递归,哐哐哐写,最后那个判断大小还是看了参考代码,改良了一下我写的代码-_-||

4 验证二叉搜索树

题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

代码

class Solution {
    TreeNode max;
    public boolean isValidBST(TreeNode root) {
        if(root==null ) return true;
        boolean left=isValidBST(root.left);
        if(left==false) return false;
        if(max!=null && root.val<=max.val) return false;
        max=root;
        boolean right=isValidBST(root.right);
        return right;
    }
}

总结

我以为很简单,naive啊!结果深深陷入陷阱一,还对着参考代码,不明白max干嘛的。
参考: 代码随想录
我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点,而不是单纯的比较左节点小于中间节点,右节点大于中间节点。
刷题10.31_第1张图片
这不是二叉搜索树!

你可能感兴趣的:(leetcode,数据结构)