我需要一个'智能'搜索功能,它将返回二叉树中的元素数量,这些元素大于给定参数但不会遍历所有节点。
例如,如果我想找到大于16的元素数量,它将不会在15的左节点中查找它们,依此类推。
20
/ \
15 21
/ \ \
5 17 28
/ \ / \
1 8 24 30
/ \
23 26
我创建了一个遍历所有节点的函数,它看起来像这样:
void search(node* p, int k, int* num)
{
if(p)
{
search(p->left, k, num);
if(p->info > k)
(*num)++;
search(p->right,k, num);
}
}
答案 0 :(得分:1)
简单,真的。
如果当前节点是< = k,则不要向左移动,因为左子树中的任何内容都不会是> ķ。 不过,你仍然必须走右路。
if (p->info > k) {
(*num)++;
search(p->left, k, num);
}
search(p->right, k, num);
答案 1 :(得分:0)
文学做你所说的。
如果节点< = k。
处的值,则修改算法不检查左子节点注意:如果修改树以在每个节点中存储子节点数(总和,递归),则可以获得更好的性能。
答案 2 :(得分:0)
在tree_node
中创建另一个字段,该字段存储该节点的in order
个数字。 Inorder number
表示以inorder
方式遍历树时节点的等级。对于您的示例,它看起来如下:
6
/ \
4 7
/ \ \
2 5 11
/ \ / \
1 3 9 12
/ \
8 10
现在,给定数字,转到该节点,该节点仅比给定节点大。到目前为止,您还需要维护树中节点的总数。
答案是Total nodes - Current_Nodes_Rank + 1
。
它可以在O(logN)
时间内完成,但代价为O(N)
内存。还要记住,树对更新非常敏感。将新节点添加到树中时,您需要额外的O(N)
时间来更新每个节点的rank
。
例如,假设数字为16
。首先你看,20(>16)
。所以,向左走,找一个更近的。我们有15
。但它不到16
。向右走,寻找更近的一个。我们有17
。由于这是一个有效的,并且它没有更多的孩子,请停在这里。
查看inorder rank
的{{1}}。所以答案是17
。
希望这会有所帮助。