二叉树'智能'搜索功能c

时间:2014-01-28 15:30:22

标签: c binary-tree binary-search-tree

我需要一个'智能'搜索功能,它将返回二叉树中的元素数量,这些元素大于给定参数但不会遍历所有节点。

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

3 个答案:

答案 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

希望这会有所帮助。