当前位置: 首页 > 知识库问答 >
问题:

这个算法是O(d),其中d是二叉查找树的深度

欧阳安晏
2023-03-14

我正在练习数据结构考试,并一直在研究这个问题:“编写一个算法,在二叉搜索树 T 中找到第 k 个最高节点值。算法必须在O(d)中运行,其中d是树的深度。

我想出了这个(几个小时后),但不确定运行时,我已经遍历了树两次,这是2d吗?我还希望得到一些关于如何减少我使用的方法数量的建议(如果可能的话)。

下面是我的答案,使用递归帮助器方法来计算树中节点的数量和有序DFS:

public int getKthHighestValue(Node root, int k) {
    int nodeCount = countNodes(root);
    if (k < 0 || k > nodeCount)
        return -1;
    ArrayList<Integer> nodeList = new ArrayList<>();
    getNodeValues(root, nodeList);
    return nodeList.get(k-1);
}

private void getNodeValues(Node root, ArrayList<Integer> nodeList) {
    if (root == null) {
        return;
    }
    getNodeValues(root.getLeft(), nodeList);
    nodeList.add(root.getValue());
    getNodeValues(root.getRight(), nodeList);
}


private int countNodes(Node root) {
    if (root == null) {
        return 0;
    }
    return 1 + countNodes(root.getLeft()) + countNodes(root.getRight());
}

共有1个答案

潘志国
2023-03-14

你混淆了两个完全不同的变量 ndd 是树的深度,n 是节点数。算法的复杂性为 O(n),因为它的增长速率相对于树中的节点数,与树的深度无关。在只剩下子项的退化树(链表)中,复杂性仍然相同。

一般来说,O(d)算法需要使用比较递归步骤,该步骤询问关于当前节点值的问题,并相应地进行遍历(二分搜索法)。通过这种方式,您可以使用BST的sorted属性在树中直接向下移动(相对于< code>d)。

这也是为什么保持BST平衡很重要的原因(AVL /红黑树等)。如果没有平衡,d 不再有意义,插入/删除/查找的复杂性开始看起来像 n 而不是所需的 O(n log(n)),这是在每次迭代时将搜索空间减少一半的算法的典型复杂性。

话虽如此,如果不使用阶次统计树在每个节点中保留其他信息,则不清楚 O(d) 算法是否可行(有关详细信息,请参阅此答案)。

 类似资料:
  • 我需要打印一个具有深度和从高到低的二叉搜索树,根据深度,在打印节点之前增加破折号的数量。树根用0破折号,她的树梢用1破折号……我可以打印没有破折号的树,但我不知道如何用破折号打印。我用的是C.对不起我的英语不好

  • 二叉搜索树(BST)中节点的深度与其与根的距离相同吗?我想是的,但我不确定。我相信距离是树的一般概念,深度是应用于BST的概念。

  • QSTN:当它是叶节点时,为什么需要初始化ls=0或rs=0。考虑链接中给出的树,如果我们到达节点4,如果(node==NULL isLeaf(node))返回1;上面的代码将1(true)返回到调用它的函数,即节点10,类似地,右侧将true返回到节点10,因此我们现在可以进入下面的循环,因为如果(isSumTree(node->left)&&isSumTree(node->left)&&isS

  • 我坚持使用递归函数来查找二叉树中节点的深度,更具体地说,是在else条件中: 如果树是二叉搜索树,知道左子值总是低于父值,右子值总是高于父值,我可以添加一个If条件,这样如果节点x值低于根,我总是返回根- 当查看函数时,假设节点总是存在的,节点x永远不是根,并且在开始时传递的深度总是0。 如果树是二叉搜索:

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个