刷题笔记——二叉树06

51 阅读2分钟

1.最大二叉树

题目要求是给一个数组,让最大的树当作根节点,建立一棵二叉树,题目要求是这样的

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树

这个题目和之前的前序构建二叉树,中序构建二叉树很是类似,都涉及到左右子树的切分 采用递归的方法解决这道题的递归步骤如下:

  1. 递归的找到最大值:
    • 遍历数组进行比较
  2. 切割左右子树:
    • 根据找到的最大值进行切割

周而复始,知道递归的nums长度成了0,表示这一个数组已经遍历完毕了

//这道题需要借助一个build函数完成对nums的切割
public TreeNode constructMaximumBinaryTree(int[] nums) {
    if(nums.length == 0) return null;
    return build(nums,0,nums.length - 1);
}
public TreeNode build(int[] nums,int start,int end){
    if(start > end) return null;
    //定义切割的位置和当前子树的最大值
    int locale = -1,maxVal = Integer.MIN_VALUE;
    // 遍历数组
    for(int i = start,i <= end;i ++){
        if(num[i] > maxVal){
            maxVal = nums[i];
            locale = i;
        }
    }
    TreeNode root = new TreeNode(maxVal);
    root.left = build(nums,start,locale - 1);
    root.right = build(nums,locale + 1,end);
    return root;
}

2.合并二叉树

递归的合并到root1上,如果root1是空,按照合并结果应当返回root2,如果都不为空,则将root1的val加上root2的val,然后返回root1

3.二叉搜索树中的搜索

直接二分遍历,大比较右子树,小比左子树

4.验证二叉搜索树

这道题需要注意一下,在刚开始写的时候总是想着只要左子树的值小于跟节点,使用record不断更新判断,但是这样想是错误的,比如这种情况

假BST.png

所以要直接将根节点与最小值和最大值相比较

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