二叉树&x27;智能&x27;c语言中的搜索函数

二叉树&x27;智能&x27;c语言中的搜索函数,c,binary-tree,binary-search-tree,C,Binary Tree,Binary Search Tree,我需要一个“智能”搜索函数,它将返回二叉树中大于给定参数但不会通过所有节点的元素数 例如,如果我想找到大于16的元素数,它不会在15的左节点中查找它们,以此类推 20 / \ 15 21 / \ \ 5 17 28 / \ / \

我需要一个“智能”搜索函数,它将返回二叉树中大于给定参数但不会通过所有节点的元素数

例如,如果我想找到大于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);         
     }           
}

照你说的做

如果节点上的值非常简单,请修改算法以不检查左子节点


如果当前节点为则在
树\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