求二叉树最小值的时间复杂度

时间:2015-03-19 23:49:25

标签: algorithm binary-tree time-complexity

我编写了一个递归函数来查找二叉树的最小值(假设它没有被排序)。

代码如下。

//assume node values are positive int.
int minValue (Node n) {
if(n == null) return 0;
leftmin = minValue(n.left);
rightmin = minValue(n.right);
return min(n.data, leftmin, rightmin);
}

int min (int a, int b, int c) {
int min = 0;
if(b != 0 && c != 0) {
if(a<=b) min =a;
else min =b;
if(min<=c) return min;
else return c;
}
if(b==0) {
if(a<=c) return a;
else return c;
}
if(c==0) {
if(a<=b) return a;
else return b;
}
}

我猜minValue函数的时间复杂度是直觉的O(n)。

这是对的吗?有人可以展示minValue函数时间复杂度的正式证明吗?

2 个答案:

答案 0 :(得分:3)

假设您的二叉树没有排序,那么您的搜索算法将有O(N)个运行时间,因此您的直觉是正确的。它需要O(N)的原因是,您平均必须搜索树中一半的节点才能找到输入。但这假定树完全无序。

对于已排序的平衡二叉树,搜索将采用O(logN)。原因是搜索只需要遍历树中的一条路径。具有N个节点的平衡树将具有 log(N)的高度,这解释了搜索的复杂性。例如,请考虑以下树:

      5
    /   \
  3      7
 / \    / \
1   4  6   8

树中有8个(实际上是7个)节点,但高度仅为 log(8) = 2.您可以说服自己只需要遍历此树一次找到一个值或者没有这样做。

请注意,对于不平衡的二叉树,这些复杂性可能不适用。

答案 1 :(得分:0)

比较次数为n-1。证明是old chestnut,通常适用于说明在单次淘汰网球比赛中需要多少场比赛的问题。每次比较都会从考虑中删除一个数字,因此如果树中最初有n个数字,则需要进行n-1次比较以将其减少为1。