我有一个平衡的二进制搜索树,我希望找到最左边的节点,它使用类似a
的函数存储大于或等于ask(a)
这个固定数字的整数。
例如假设我在树中添加了以下几点8,10,3,6,1,4,7,14,13
然后树会是这样的:
现在ask(1)
应为1
,ask(3)
应为3
,ask(2)
应为3
,依此类推。
我认为我可以使用Inorder遍历来编写我的ask
函数,但我不知道如何。
到目前为止,我写了这段代码:
inorderFind(node->left, a);
if (node->key.getX() >= a)
return node;
inorderFind(node->right, a);
第一个参数是当前树节点,a
是上面描述的a
。我知道我可以使用像bool
这样的flag
变量,并在if条件成立时将其设置为true
,然后它会阻止遍历树的其他节点并返回假节点。还有什么我可以做的吗?
答案 0 :(得分:1)
树具有通过简单的递归算法允许查询的奇妙属性。所以,让我们尝试找一个查询的递归表达式。
说LEFTMOST(u)
是回答这个问题的函数:
给定以节点
u
为根的二进制搜索子树,左(和)可能为null 正确的孩子l
和r
,分别是最左边的节点 值>= a
?
关系非常简单:
LEFTMOST(u) = LEFTMOST(l) if it exists
LEFTMOST(r) otherwise
那就是它。你如何将它转化为你的问题以及你如何处理像" null"这样的概念。并且"不存在"是你代表的功能。