如何计算空间复杂度以检查二叉搜索树是否平衡?

时间:2014-05-30 21:36:02

标签: algorithm big-o binary-search-tree time-complexity

我想检查提供给我的二进制搜索树是否平衡。

由于树已经存在于内存中,因此在遍历节点时检查树是否平衡时不需要额外的存储空间。

所以我假设空间复杂度为O(1)。

这是对的吗?

// Definition for binary tree
  class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
    val = x;
}
 }

  public class Solution {
public boolean isBalanced(TreeNode root) {
    if (root == null)
        return true;

    if (getHeight(root) == -1)
        return false;

    return true;
}

public int getHeight(TreeNode root) {
    if (root == null)
        return 0;

    int left = getHeight(root.left);
    int right = getHeight(root.right);

    if (left == -1 || right == -1)
        return -1;

    if (Math.abs(left - right) > 1) {
        return -1;
    }

    return Math.max(left, right) + 1;

}
}

1 个答案:

答案 0 :(得分:0)

你的算法是O(height)空间,而不是O(1) - 当你递归树时,你需要在内存中为每个节点存储1个递归函数调用,你永远不会超过{{1在树中(在返回之前,可以摆脱已经完全处理的节点)。

对于像这样的树:

<子>(Image reference - Wikipedia

你的电话会是这样的:

O(height)

此处getHeight(8) getHeight(3) getHeight(1) getHeight(6) getHeight(4) getHeight(7) getHeight(10) getHeight(14) getHeight(13) 调用getHeight(8),调用getHeight(3)getHeight(1)等。

在我们调完getHeight(6)的功能后(将结果返回到1的调用),我们不再需要将其保留在内存中,因此我们在内存中保留的最大调用次数等于树的高度。


可以在3空间内完成,但它相当复杂且非常慢(比解决方案所需的O(1)慢得多。)

关键是我们有一个二叉搜索树,因此,给定一个节点,我们知道该节点是否在任何祖先节点的左子树或右子树中,我们可以用它来确定父节点的父节点。节点。

我可能会在某个时候创建​​一个单独的Q&amp; A进入更多细节。