首页 文章

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

提问于
浏览
1

我有一种方法可以在二进制搜索树(BST)中查找下一个inorder后继 . “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) . 那是对的吗?

1 回答

  • 1

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

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

    请注意,您不能说每个操作都需要花费时间O(1) . 这不是真的 . 你可以说的是,总的来说每个人平均花费O(1)的时间 .

相关问题