c++ - BST中的中序遍历

标签 c++ algorithm

我有一个平衡的整数二叉搜索树,我想找到最左边的节点,它存储大于或等于固定数字的整数,如 a 使用 ask(a )

例如,假设我在我的树中添加了以下点,8,10,3,6,1,4,7,14,13

那么树应该是这样的:

enter image description here

现在ask(1)应该是1ask(3)应该是3ask(2) 应该是 3 等等。

我认为我可以使用中序遍历来编写我的ask 函数,但我不知道如何做。

到目前为止,我已经编写了这段代码:

inorderFind(node->left, a);
if (node->key.getX() >= a)
    return node;
inorderFind(node->right, a);

第一个参数是当前树节点,a 是上面描述的a。我知道我可以使用 bool 变量,如 flag 并在 if 条件成立时将其设置为 true,然后它会阻止行走通过树的其他节点并返回错误节点。还有什么我可以做的吗?

最佳答案

树具有允许通过简单的递归算法进行查询的奇妙特性。因此,让我们尝试找到您的查询的递归公式。

LEFTMOST(u) 是一个回答这个问题的函数:

Given the binary search subtree rooted at node u, with(possibly null) left and right children l and r, respectively, what is the left-most node with a value >= a?

关系很简单:

LEFTMOST(u) = LEFTMOST(l) if it exists
              LEFTMOST(r) otherwise

就是这样。如何将其转化为您的问题以及如何处理“空”和“不存在”等概念是您表示的一个功能。

关于c++ - BST中的中序遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30579403/

相关文章:

c++ - 检查给定进程是否正在运行

c++ - matlab中for循环的嵌套条件,如c++

c++ - 当提供 windows .dmp 或 .minidmp 时,您如何识别(并访问)要使用的模块/调试符号

c++ - 多线程 - 彼得森的算法不起作用

在 "r+b"模式下使用时,C++11 fgetc 向我的文件输出 0

c - 在 ANSI C 中,如何在不使用日期变量的情况下处理 > 或 < 跨越午夜的时间表达式

java - 在 Java 中搜索树中的节点

c++ - 数据结构实现代码理解

c# - 如何在按字典顺序对字符串进行排序时忽略/跳过 'n' 元素

c++ - OpenCV 无法读取 MP4 视频