我有一种方法可以在二进制搜索树(BST)中查找下一个inorder后继。 " inorderSuccessor" method将BST的任何节点作为输入并输出下一个inorder后继。方法和树类定义如下:
class BSTInorderSuccessor{
public static Node inorderSuccessor(Node node) {
if (node.right != null) {
return minValue(node.right);
}
Node parent = node.parent;
while (parent != null && node == parent.right){
node = parent;
parent = parent.parent;
}
return parent;
}
}
class TreeNode{
int data;
Node left;
Node right;
Node parent;
public TreeNode(int data){
this.data = data;
this.left = null;
this.right = null;
this.parent = null;
}
}
假设BST的高度为h,并且此树结构中有n个节点。我知道" inorderSuccessor"的时间复杂度。方法是O(h)。
我的问题是:鉴于BST的最小节点。当我写一个方法来连续调用" inorderSuccessor"要打印BST的所有节点,总时间复杂度是多少?我认为这是O(n * h)。这是对的吗?
答案 0 :(得分:1)
您可以通过始终在O(nh)找到inorder后继来限制打印所有内容的成本,但这实际上并不是一个紧张的限制。您可以显示运行时实际上是Θ(n),与树的高度无关!
查看此内容的一种方法是查看树中每个边缘被访问的次数。如果你追踪所有那些inorder遍历的执行情况,你会发现你只是每个边缘向下走一次并且每个边缘只上升一次,并且完成的总工作量与每个边缘被访问的次数成比例。 n节点树中的边数是Θ(n),因此是运行时限制的。
请注意,不能表示每个操作都需要时间O(1)。这不是真的。您可以说的是聚合每个人都需要平均的O(1)时间。