Java 顺序后继法打印BST的时间复杂度

Java 顺序后继法打印BST的时间复杂度,java,algorithm,time-complexity,binary-search-tree,inorder,Java,Algorithm,Time Complexity,Binary Search Tree,Inorder,我有一个在二元搜索树(BST)中查找下一个顺序后继项的方法。“inorderSuccessor”方法将BST的任何节点作为输入,并输出下一个inorder后续节点。方法和树类的定义如下: class BSTInorderSuccessor{ public static Node inorderSuccessor(Node node) { if (node.right != null) { return minValue(node.right); } Nod

我有一个在二元搜索树(BST)中查找下一个顺序后继项的方法。“inorderSuccessor”方法将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)。这是正确的吗?

您可以通过始终在O(nh)处找到顺序更高的后继者来确定打印所有内容的成本上限,但这实际上不是一个严格的界限。您可以显示运行时实际上是Θ(n),与树的高度无关

查看这一点的一种方法是查看树中每条边被访问的次数。如果您追踪所有这些按序遍历的执行情况,您会发现每个边只向下走一次,每个边只向上走一次,完成的总工作量与访问每个边的次数成正比。n节点树中的边数为Θ(n),因此为运行时界限


请注意,您不能说每个单独的操作都需要时间O(1)。那不是真的。您可以说,总的来说,每个节点平均需要O(1)个时间。

打印BST中的所有节点?这不是
O(*BST*中的节点数)
?无论它们是按顺序、前顺序还是其他顺序进行枚举?@AlexBollbach有(愚蠢的)方法可以打印出不是在线性时间内运行的所有内容,例如执行DFS打印深度为0的所有节点,然后打印深度为1的所有节点,等等。,所以一个问题并不是完全不合理的。这个问题规定了顺序的使用。啊,我明白了。“或者随便什么”。我的意思是,任何东西都只能代替集合的剩余序列类型{preorder,inoorder,posterorder}。AKA,我知道的BST遍历样式集!谢谢你的解释。这很有帮助!