Time 以这种方式实现BST顺序遍历的时间复杂性

Time 以这种方式实现BST顺序遍历的时间复杂性,time,complexity-theory,binary-search-tree,traversal,Time,Complexity Theory,Binary Search Tree,Traversal,通常情况下,如果使用深度优先遍历,我们会得到O(n)time。但是,如果我们先找到最小元素,然后调用succession()方法n次,那么它的时间复杂度是多少 我认为它可能是O(logn),因为后继者是O(logn),但这似乎不正确。这里有谁能提供任何深入的分析(可能涉及一些极限分析)?这不是一个正式的论点,但对O(n)来说是一个相当有说服力的论点: 后继函数始终采用从起始节点到后继节点的最短路径。它要么下降,要么上升,但一旦它开始做一个,它就不能换成另一个。因此,它必须采取最短的路径 后继函数

通常情况下,如果使用深度优先遍历,我们会得到
O(n)
time。但是,如果我们先找到最小元素,然后调用
succession()
方法
n
次,那么它的时间复杂度是多少


我认为它可能是
O(logn)
,因为后继者是
O(logn)
,但这似乎不正确。这里有谁能提供任何深入的分析(可能涉及一些极限分析)?

这不是一个正式的论点,但对O(n)来说是一个相当有说服力的论点:

后继函数始终采用从起始节点到后继节点的最短路径。它要么下降,要么上升,但一旦它开始做一个,它就不能换成另一个。因此,它必须采取最短的路径

后继函数必须产生与深度优先方法相同的输出,因此它必须以相同的顺序访问相同的节点(即,输出的节点,它不必经过相同的节点,尽管它确实如此)

深度优先方法还始终采用每个输出节点之间的最短路径(在每个步骤中,它要么向下,要么向上,而不是同时向上)


因此,每个方法采用完全相同的路径,实际上是等效的。

如果每个节点上都存在父指针,则调用后续方法n次需要O(n)时间。要看到这一点,请注意树中的每条边最多被所有后续调用组合访问两次(一次从父级访问到子级,一次从子级访问到父级)。因此,所有后续调用访问的边的总数最多为2n。因此,运行时间为O(n)


现在,如果父指针不存在,在每次调用中,我们必须从根开始,通过遍历O(logn)节点(如果树是平衡的)来搜索后续元素。因此复杂性变为O(n log n)。

@n看来这绝对不适合于cstheory。查看常见问题解答:但是,在cs.stackexchange上欢迎提出类似的问题。com@joe啊,你说得对,就是这样,应该走了,谢谢你提供的信息