leetcode
leetcode 1701 ~ 1750
给定二叉搜索树的插入顺序求深度

给定二叉搜索树的插入顺序求深度

难度:

标签:

题目描述

代码结果

运行时间: 2055 ms, 内存: 39.4 MB


/*
 * 题目思路:
 * 使用Java Stream的方式插入节点,并计算二叉搜索树的最大深度。
 * 我们使用递归方式计算最大深度。
 */
import java.util.Arrays;

public class Solution {
    // 定义树节点类
    static class TreeNode {
        int val;
        TreeNode left, right;
        TreeNode(int x) { val = x; }
    }

    // 插入节点到二叉搜索树
    public TreeNode insert(TreeNode root, int val) {
        if (root == null) {
            return new TreeNode(val);
        }
        if (val < root.val) {
            root.left = insert(root.left, val);
        } else if (val > root.val) {
            root.right = insert(root.right, val);
        }
        return root;
    }

    // 计算树的最大深度
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
    }

    // 主函数
    public int getDepth(int[] nums) {
        // 使用Stream API构建BST并计算最大深度
        TreeNode root = Arrays.stream(nums).reduce(null, this::insert, (a, b) -> a);
        return maxDepth(root);
    }
}

解释

方法:

该题解使用了一个平衡二叉树(通过SortedList实现)和一个哈希表(defaultdict)来跟踪插入的每个元素的深度。对于输入的每一个元素x,我们首先查找它应该插入的位置。在SortedList中,我们找到紧邻x左侧的元素k,并将x的深度设置为k的深度加1。每次插入后,我们将x添加到SortedList中以保持元素的有序性,并更新最大深度。通过这种方式,我们可以有效地计算出二叉搜索树的最大深度。

时间复杂度:

O(n log n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么选择使用SortedList而不是其他数据结构如AVL树或红黑树来维护元素的有序性?
SortedList是一种自动维护元素排序的数据结构,使用简单且在某些编程语言和库中直接可用,如Python的sortedcontainers库。它通过一种平衡树结构(通常是红黑树或AVL树)实现,提供了高效的插入、删除和查找操作。选择SortedList而非直接使用AVL或红黑树,主要是因为SortedList提供了更简洁的API和较少的实现复杂度,同时保持了较好的性能,尤其是在需要频繁进行有序操作的场景下。
🦆
在寻找x左侧的元素k时,如果x小于SortedList中的所有元素,这种情况下如何处理?
在提到的代码实现中,使用`sl[sl.bisect_left(x) - 1]`来找到x左侧的元素k。如果x小于SortedList中的所有元素,`sl.bisect_left(x)`将返回0,此时`sl[sl.bisect_left(x) - 1]`会变为`sl[-1]`,即列表中的最后一个元素,这在逻辑上是不正确的。正确的处理方式应当是检查`sl.bisect_left(x)`的值是否为0,如果为0,则表示没有左侧元素,x的深度应该是1,因为它将作为树的根节点或其子树的根节点。
🦆
代码中`book[x + 1] = book[k + 1] = book[k + 1] + 1`似乎有语法错误或逻辑错误,请问正确的更新方式应该是什么?
确实,`book[x + 1] = book[k + 1] = book[k + 1] + 1`这行代码存在逻辑和可能的语法错误。正确的方式应该是首先计算新的深度值,然后更新x对应的深度。例如,先通过`new_depth = book[k] + 1`计算出新的深度,然后使用`book[x] = new_depth`来更新x的深度。这样可以避免混淆和错误的数据更新。

相关问题