6.14最大二叉树(LC654-M)

6.14最大二叉树(LC654-M)_第1张图片

算法:

凡是涉及到构造二叉树的,都要用前序遍历!

中:首先找到数组中的最大值,即根节点。构造根节点。

左右:接着构造左子树和右子树。使用递归构造。

正确代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return construct (nums, 0, nums.length);

    }
    public TreeNode construct (int[] nums, int leftindex, int rightindex) {
        //leftindex为0,rightindex为数组的长度
        //排除空数组
        if (rightindex == leftindex) return null;
        //排除只有一个元素的情况
        if (rightindex - leftindex == 1) return new TreeNode(nums[leftindex]);
        //找最大值,左闭右开
        int maxindex = leftindex;
        int maxval = 0;
        for (int i=leftindex+1; i nums[maxindex]){
                maxindex = i;
                maxval = nums[i];
            }
        }
        //构造根节点
        TreeNode root = new TreeNode(nums[maxindex]);
        //当maxindex左边有值时,再在左边递归(保持左闭右开原则)
        if (maxindex > 0) {
            root.left = construct(nums, leftindex, maxindex);
        }
        //当maxindex右边有值时,再在右边递归(保持左闭右开原则)
        if (rightindex - maxindex > 0) {
            root.right = construct(nums, maxindex+1, rightindex);
        }
        return root;
    }
}

要注意的问题:

1.为什么constructMaximumBinaryTree中已经声明了Nums的类型,constructMaximumBinaryTree1中还要再次声明?

在Java中,当声明一个方法时,需要指定参数的类型。每个方法都可以有自己的一组参数,即使它们与同一类中其他方法中的参数具有相同的名称和类型。

因此,在给定的代码中,`constructMaximumBinaryTree``constructMaximumBinaryTree1`方法都有它们自己的`int[] nums`参数声明。这是因为它们是独立的方法,每个方法都需要声明自己的一组参数。

2.为什么可以有两个public函数?

在Java中,一个类可以有多个`public`函数。`public`关键字表示这些函数是公共的,可以从类的外部访问。每个Java文件中可以有一个`public`类,该类的名称必须与文件名相同,但可以有多个非`public`类。这些非`public`类可以包含任意数量的方法,其中可以包括`public`方法。

在给定的代码中,`constructMaximumBinaryTree``constructMaximumBinaryTree1`都是`public`方法,因此它们可以被该类之外的其他类访问和调用。这种设计允许其他类使用这两个方法来构建最大二叉树。

因此,允许一个类拥有多个`public`方法是Java语言的一部分,这使得类的接口更加灵活,可以提供多个公共方法以供外部使用。

时间空间复杂度

在这段代码中,`constructMaximumBinaryTree`方法用于构造最大二叉树,而`construct`方法用于实际的构造过程。让我们来计算一下时间和空间复杂度。

时间复杂度分析

  • 在每次构造中,都需要遍历当前数组片段以找到最大值。这个过程的时间复杂度为 O(n),其中 n 为当前数组片段的长度。
  • 在最坏情况下,每个节点都需要被访问一次,因此构造整棵树的时间复杂度为 O(n^2)。这是因为在最坏情况下,每次找最大值时都需要遍历当前数组片段。

空间复杂度分析

  • 递归调用的深度最坏情况下为  O(n),因此空间复杂度也为 O(n)。

因此,该算法的时间复杂度为 O(n^2),空间复杂度为 O(n)。

你可能感兴趣的:(#,6.二叉树,数据结构)