【问题标题】:what's the stack space of this code?这段代码的堆栈空间是多少?
【发布时间】:2015-09-09 15:17:46
【问题描述】:

问题是检查树是否是有效的 BST。有两种递归方法来解决。我认为它们的空间复杂度都是 O(logN),N 是 TreeNode 的数量,所以 logN 实际上是树的高度。但是在一本解决方案书中,它说堆栈空间是 O(N),我无法弄清楚。有人可以帮我吗?谢谢!

public class Solution {
        public boolean isValidBST(TreeNode root) {
            return isValidBST(root, null, null);
        }

        private boolean isValidBST(TreeNode x, Integer min, Integer max) {
            return x == null || (min == null || x.val > min) && (max == null || x.val < max) &&
                                isValidBST(x.left, min, x.val) && isValidBST(x.right, x.val, max);
        }
    }

public class Solution {
    private TreeNode prev;

    public boolean isValidBST(TreeNode root) {
        prev = null;
        return isMonotonicIncreasing(root);
    }

    private boolean isMonotonicIncreasing(TreeNode p) {
        if (p == null)  return true;
        if (isMonotonicIncreasing(p.left)) {
            if (prev != null && p.val <= prev.val) return false;
            prev = p;
            return isMonotonicIncreasing(p.right);
        }

        return false;
    }
}

【问题讨论】:

  • 谢谢,但是对于二叉树最大深度(leetcode.com/problems/maximum-depth-of-binary-tree)的问题,书上说空间是O(logN),return (root == null)? 0 : 1 + Math.max(maxDepth(root.left), maxDepth(root.right));我认为它们是相同的。
  • 它是O(N),因为如果不平衡树降级为链表,它的深度可以达到O(N)
  • 非常感谢。那讲得通。但是对于我上面提到的 Leetcode 中二叉树的最大深度问题。官方解说空间成本是O(logN),二叉树也可以不平衡。所以我仍然感到困惑。谢谢!

标签: binary-search-tree


【解决方案1】:

空间要求为 O(h),其中 h 是树的高度。

当树平衡时,Log(n) 是此代码的最佳情况。

但在倾斜树的情况下,空间复杂度将为 O(n),即线性。

例如,对于以下树,代码将占用 Exactly S(n) 空间:

               1                            5    
                 2                        4
                   3                    3
                     4                2 
                       5            1 

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2023-02-26
    • 2016-10-10
    • 2015-07-02
    • 2022-11-14
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多