使用inorder后继方法打印BST的时间复杂度

时间:2017-06-13 22:42:47

标签: java algorithm time-complexity binary-search-tree inorder

我有一种方法可以在二进制搜索树(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)。这是对的吗?

1 个答案:

答案 0 :(得分:1)

您可以通过始终在O(nh)找到inorder后继来限制打印所有内容的成本,但这实际上并不是一个紧张的限制。您可以显示运行时实际上是Θ(n),与树的高度无关!

查看此内容的一种方法是查看树中每个边缘被访问的次数。如果你追踪所有那些inorder遍历的执行情况,你会发现你只是每个边缘向下走一次并且每个边缘只上升一次,并且完成的总工作量与每个边缘被访问的次数成比例。 n节点树中的边数是Θ(n),因此是运行时限制的。

请注意,不能表示每个操作都需要时间O(1)。这不是真的。您可以说的是聚合每个人都需要平均的O(1)时间。