leetcode
leetcode 2751 ~ 2800
最小高度树

最小高度树

难度:

标签:

题目描述

Given a sorted (increasing order) array with unique integer elements, write an algo­rithm to create a binary search tree with minimal height.

Example:

Given sorted array: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5],which represents the following tree: 

          0 
         / \ 
       -3   9 
       /   / 
     -10  5 

代码结果

运行时间: 27 ms, 内存: 17.9 MB


/*
 * 题目思路:
 * 使用Java Stream API来实现同样的逻辑,我们需要注意的是,Stream不直接支持数组的分割操作,
 * 因此我们仍然需要在递归调用中手动进行数组的分割。Stream的使用主要体现在构造初始的TreeNode数组。
 */

import java.util.Arrays;
import java.util.stream.IntStream;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        if (nums == null || nums.length == 0) return null;
        return helper(nums, 0, nums.length - 1);
    }
    
    private TreeNode helper(int[] nums, int left, int right) {
        if (left > right) return null;
        int mid = left + (right - left) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = helper(nums, left, mid - 1);
        node.right = helper(nums, mid + 1, right);
        return node;
    }
}

解释

方法:

题解采用了递归的方法来构建一棵高度平衡的二叉搜索树。首先,选取数组的中间元素作为树的根节点,这样可以保证左右子树的元素数量尽可能相等,从而达到最小高度的目的。接着,递归地使用中间元素左侧的子数组构造左子树,使用右侧的子数组构造右子树。这种方法每次都平分数组,故可以确保生成的二叉搜索树是高度平衡的。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么选择数组的中间元素作为树的根节点是构建高度最小二叉搜索树的最优策略?
选择数组的中间元素作为树的根节点可以保证左右子树的元素数量大致相等。这种平衡是非常关键的,因为在二叉搜索树中,平衡的树结构可以大大降低树的最大高度,从而使树的查找、插入和删除操作尽可能高效。如果树高度不平衡,可能会导致操作效率降低,接近于线性查找。因此,通过始终选择中间元素作为根,可以使得生成的二叉搜索树尽可能接近完全平衡,从而实现最小高度。
🦆
在递归构建二叉搜索树时,如何处理数组长度为偶数的情况,选择哪个中间元素作为根节点?
在数组长度为偶数时,可以选择中间两个元素中的任一个作为根节点。通常,选择中间位置的元素策略有一定的灵活性。在题解中的实现,使用`(i + j) // 2`自然地选取了中间靠左的元素作为根节点(当索引从0开始时)。这种选择仍然能够保持树的平衡性,尽管左右子树的元素数量可能相差一个。选择哪个中间元素主要取决于具体实现,但对树的总体平衡性影响不大。
🦆
递归函数`dfs`在何种情况下会返回`None`?这对构建的二叉树有什么影响?
递归函数`dfs`会在其输入的子数组范围无效(即`i > j`)时返回`None`。这种情况发生在尝试构建一个为空的子树时,例如,当某个节点成为叶子节点时,它的子树(左或右)可能不包含任何元素。这个返回值`None`表示在当前位置没有更多的子节点要添加,是构建正确二叉搜索树的必要步骤,确保了树的结构正确性和逻辑一致性。

相关问题