破解编码面试 - 例9(运行时示例)

时间:2016-03-13 02:38:12

标签: runtime

这个问题与二叉搜索树的深度有关,但我的问题是要理解下面显示的示例代码:

int sum(Node node) {
    if (node == null){
        return 0;
    }
    return sum (node.left) + node.value + sum(node.right);
}

作者说这个深度大致是log N,我不知道怎么得到log N.

另外,我对这段代码的理解,似乎是无限的。我知道不是,但我不能说服自己。例如,如果这是1~3个数组,则节点从@ 2开始,所以:

LVL 1:sum(1)+ 2 + sum(3)

LVL 2:总和(sum(0)+ 1 + sum(2))+ 2 + sum(sum(2)+ 3 + sum(0))

LVL 3:...(总和(2)将重复LVL 1,它永远不会结束)

任何人都可以帮我指出这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

决定将我的评论转为答案:

二进制树是log n,因为每次都会将它切成两半,但这是一棵平衡的树。例如,如果一切都在右边,那么非常不平衡的就是O(N)。

那么,为什么它不是无限的?

由于这是递归的,它需要一种方法来停止调用自身,也就是说当节点为空时,它就会失效。

因此,在每棵树中,您最终都会到达未设置的子节点,这些将停止递归,从而阻止它无限。

如果你删除那个if语句,那么你会得到一个异常,但是在递归算法中实际上做了一些不会结束的事情,你会得到一个堆栈溢出。