【发布时间】:2013-01-07 03:40:17
【问题描述】:
我的问题如下:
我有一个带有键的二叉搜索树:a1<a2<...<an,问题是打印树中的所有 (a_i, a_i+1) 对(其中 i={1,2,3,...})在 O(n) 时间内使用递归算法,没有任何全局变量并使用 O(1) 额外空间。一个例子:
让键为:1,2, ..., 5
将打印的对:(1,2) (2,3) (3, 4) (4, 5)
所以你不能在树中进行中序遍历并找到每个节点的后继/前继。因为这将花费 O(nh) 时间,并且如果树是平衡的,那么整棵树将是 O(nlgn)。
【问题讨论】:
-
按序遍历不是 O(nlgn)...
-
是的,中序遍历是 O(n),但平均情况下后继函数是 O(h),在最坏的情况下是 O(n),因此如果您平均为每个节点调用后继或前任,它将是 O(nlgn) 但在最坏的情况下它是二次的。
-
这不是真的。在完整的遍历中,每个节点最多“访问”3 次(下降一次,返回两次)。
-
其实节点“访问”的总数正好是2n;每个节点进入一次(从上面),退出一次(到上面)。
-
所以用大符号表示它将是 O(2n)=O(n) 还是我遗漏了什么?
标签: algorithm data-structures binary-tree traversal binary-search-tree