二叉树&x27;智能&x27;c语言中的搜索函数
我需要一个“智能”搜索函数,它将返回二叉树中大于给定参数但不会通过所有节点的元素数 例如,如果我想找到大于16的元素数,它不会在15的左节点中查找它们,以此类推二叉树&x27;智能&x27;c语言中的搜索函数,c,binary-tree,binary-search-tree,C,Binary Tree,Binary Search Tree,我需要一个“智能”搜索函数,它将返回二叉树中大于给定参数但不会通过所有节点的元素数 例如,如果我想找到大于16的元素数,它不会在15的左节点中查找它们,以此类推 20 / \ 15 21 / \ \ 5 17 28 / \ / \
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);
}
}
照你说的做 如果节点上的值非常简单,请修改算法以不检查左子节点
如果当前节点为则在
树\u节点
中创建另一个字段,该字段按该节点编号的顺序存储Inorder number
表示以Inorder
方式遍历树时节点的排名。对于您的示例,它如下所示:
6
/ \
4 7
/ \ \
2 5 11
/ \ / \
1 3 9 12
/ \
8 10
现在,给定数字,转到该节点,该节点刚好大于给定的节点。您还需要维护到目前为止树中节点的总数
答案将是节点总数-当前节点排名+1
它可以在O(logN)
时间内完成,代价是O(N)
内存。还要记住,树对更新非常敏感。当向树中添加新节点时,您需要额外的O(N)
时间来更新每个节点的rank
例如,给定的数字是16
。首先你会看到,20(>16)
。所以,向左走,找到一个更近的。我们有15个。但是它小于16
。向右走,找一个更近的。我们有17个。因为这是一个有效的,它没有更多的孩子,停在这里
请参见17
的顺序。所以答案是12-5+1=8
希望这有帮助 “我需要一个函数…”听起来像是家庭作业。它不会在15的左侧节点中查找它们,那么17
呢?这不是家庭作业,我用代码编辑了问题。17是15的右边是的,我看到你的编辑。到目前为止还不错。但你需要更具体一些。你的问题在哪里?我还试着在搜索前询问p->info是否小于k(p->left…),如果是,则不要向左,向右,也要向右,并且我将所有想要通过的节点乘以-1,以查看我在打印时做了什么。但它不起作用
6
/ \
4 7
/ \ \
2 5 11
/ \ / \
1 3 9 12
/ \
8 10