码迷,mamicode.com
首页 > 其他好文 > 详细

证明中序遍历O(n)

时间:2014-11-28 22:35:33      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   strong   on   div   log   bs   

算法导论12.1 什么是二叉搜索树


 

二叉搜索树应满足的性质

设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么y.key <= x.key。如果y是右子树中的一个结点,那么y.key >= y.key。(这里是可以取等于的)

例如:

     3    
    / \
2 4
/ \
1 2

可以容许相同的数。

中序遍历,因为根的遍历在左右子树之间,顾名中序,也就是左根右。

如上,中序遍历应该是:12234

那么后续遍历就是左右根:12243

前序遍历就是根左右:32124


 

可以给出中序遍历的递归式伪码:

inorderTree(x)
    if (x != NIL)
        inorderTree(x.left);
        print x.key;
        inorderTree(x.right);

 

现在来证明中序遍历是O(n)的。

T(n)表示n个节点中序遍历所需要时间。那么T(0) = c,c为常数,因为要判断x是否为NIL的常数时间。

首先,最起码要遍历n个结点,所以下限为Ω(n)。只要再证明上限O(n)那么它就是O(n)的复杂度了。

 

以下证上限:

因为有左右子树,设左子树有k个结点,那么右子树就有n-k-1个。

就有了递推式:

T(n) <= T(k) + T(n-k-1) + d

d类似常数c,是其他的常数操作。因为加了d,所以就用小于等于。

那么证明T(n) = O(n)是等价于证明如下式子成立的:

T(n) <= (c+d)*n + c

T(0) = c 显然成立,数学归纳法:

可以把红色部分的式子代入到前面那个式子的右边把右边的T(k) 和 T(n-k-1)替换掉就有了

T(n) <= ((c+d)*k + c) + ((c+d)*(n-k-1)) + c) + d = (c + d)*n + c

真神奇,可见红色部分成立,那么T(n)上限就是O(n)。

综合上下限,所以T(n)的复杂度是O(n)。

证明中序遍历O(n)

标签:style   blog   color   sp   strong   on   div   log   bs   

原文地址:http://www.cnblogs.com/higerzhang/p/4129464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!