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

在BST中打印后续和前置

池麒
2023-03-14

我的问题如下:

我有一个带关键字的二元搜索树:a1

因此,您不能在树中按顺序遍历,并为每个节点找到后续节点/前置节点。因为这需要O(nh)时间,如果树是平衡的,那么整个树的时间将是O(nlgn)。


共有2个答案

朱海超
2023-03-14

奥利说的顺序遍历是O(n)是对的,但你说的对,使用一般的后继/前置例程会增加算法的复杂性。因此:

一个简单的解决方案是使用按顺序遍历来遍历树,跟踪您最后一次获得右指向边的时间(例如,使用名为last_right_ancestor_seen的变量指向其父节点)和您看到的最后一个叶节点(例如,在last_leaf_seen(实际上,任何没有右子节点的节点)。每次您处理一个叶节点时,它的前身是last_right_ancestor,每次您遇到一个非叶节点时,它的前身是last_leaf_seen,您只需打印这两个。O(n)时间,O(1)空间。

希望足够清楚,如果不清楚,我可以给你画个图。

编辑:这是未经测试的,但可能是正确的:

walk(node* current, node* last_right_ancestor_seen, node* last_leaf_seen) {

    if(current->left != null) {
        walk(current->left, last_right_ancestor_seen, last_leaf_seen);
    }

    if(current->is_leaf()) {
            if(last_right_ancestor_seen != null)
                print(last_right_ancestor_seen->value, current->value);
    }
    else {
        print(last_leaf_seen->value, current->value);
    }

    if(current->right != null) {
        *last_right_ancestor_seen = *current;
        walk(current->right, last_right_ancestor_seen, last_leaf_seen);
    }
    else {
        *last_leaf_seen = *current;
    }

}
齐典
2023-03-14

虽然您认为查找有序的后续或前置可能需要O(h)时间,但事实证明,如果您从BST中的最小值开始,并反复查找其后续,则无论树的形状如何,所完成的总工作量最终都会达到O(n)。

根据直觉,在迭代执行后续查找时,要考虑遍历树中的每条边的次数。具体来说,您将访问树中的每条边恰好两次:一次是在您下降到子树时,一次是在您访问了该子树中的每个节点后走出子树时。由于n节点树具有O(n)边,因此需要时间O(n)才能完成。

如果您对此持怀疑态度,请尝试编写一个简单的程序来验证它。我记得当我第一次听到这个结果时,我并不相信,直到我编写了一个程序来确认它为止。:-)

在伪代码中,逻辑如下所示:

  1. 通过从根开始并重复跟随左子指针,直到不存在这样的指针,来查找树中的最小值

希望这有帮助!

 类似资料:
  • 我有一种在二元搜索树(BST)中查找下一个顺序后续项的方法。“inorderSuccessor”方法将BST的任何节点作为输入,并输出下一个inorder后续节点。方法和树类定义如下: 假设BST的高度为h,并且此树结构中有n个节点。我知道“inorderSuccessor”方法的时间复杂度是O(h)。 我的问题是:给定BST的最小节点。当我编写一个方法来连续调用“inorderSuccessor

  • 问题内容: 我正在尝试打印,并且该方法在我遇到这种情况之前效果很好。假设我要打印之前,仅在第一页(不是标题)中打印文本“ Report”,最后在文本中打印“ This is the report end”。我想再次澄清一下,我在打印时不需要仅此页眉或页脚出现在第一页的顶部和最后一页的底部。 我怎样才能做到这一点? 问题答案: 要做到这一点的方法之一是一系列适合的一个实例,如图所示这里。 附录:有一

  •   最后,我们要给绘图程序增加打印和打印预览功能。我们希望文档分两页打印,第一页为封面,打印文档名字。第二页输出文档内容,并在页眉上打印文档名字。虽然AppWizard已经自动生成了打印和打印预览的代码,但是许多情况下,并不能符合要求。 这是因为: 1.打印机和窗口(屏幕)显示的分辨率不同:打印机的分辨率用每英寸多少个点来描述,屏幕分辨率用单位面积的像素点来表示。对于同样的Arial字体下的一个字

  • 证明对树后继者的K次连续调用需要O(kh)时间。由于每个节点的访问量是atmost的两倍,因此访问的节点数的最大界限必须为2k。时间复杂度必须为O(k)。我不明白O(h)的因素在哪里。是因为访问了节点,但不是后续节点。我不能确切地解释自己,因子O(h)是如何参与整个过程的 PS:我知道这个问题已经存在,但我无法理解解决方案。

  • 问题内容: 我有一个python脚本test.py: 在linux命令行上执行 返回: 然后执行 哪个返回 如何重定向输出使os.system调用在print语句之前打印? 问题答案: 当您输出到管道时,Python缓冲写入的输出,并在刷新,溢出,关闭后(程序退出时)输出。虽然它将缓冲打印调用,但系统调用输出将直接输出到stdout中,并且其输出将不会被缓冲。这就是为什么您会看到这样的优先级。为了

  • 打印工作流程有时很复杂。首先了解所需的设置,然后再浏览到感兴趣的主题。 更多此类内容 设置打印文档 打印分色 印刷标记和出血 PostScript 打印 用色彩管理打印 打印渐变、网格和颜色混合 打印和存储透明图稿 叠印 陷印 打印预设