在BST中找到“第n”值(C)

时间:2013-05-01 02:36:35

标签: c data-structures binary-search-tree traversal

我不知道如何解决这个问题。

返回指向NAME_VAL对的指针 排序顺序中的第n个条目。

如果i = 1,则返回最小条目

如果i = n,则返回最大条目

如果n = n / 2,则返回中位数条目(或关闭)

if(i< 1 || i> n)返回NULL;

运行时必须是O(log n)

有人能指出我正确的方向解决这个问题吗?谢谢!

我的结构:

typedef struct name_val 
{
    char *name;
    double value;
}NAME_VAL;

typedef struct node
{
    NAME_VAL *nV;
    struct node *left;
    struct node *right;
}NODE;

2 个答案:

答案 0 :(得分:0)

如果树完全平衡(任何必要的不平衡限于序列的末尾),您可以通过使用n的二进制表示的位模式来指导沿着节点向下走。由于您只是要求提供一般性指导,我会将其留在那里,而不是提供代码。

如果树没有完美平衡,你必须先行走O(n)深度。或者添加一个索引(它有自己的维护成本)。

答案 1 :(得分:0)

BST中最小的元素在哪里?它是最左边的节点,没有左子节点。因此,请按照左侧链接,直到您点击NULL并且这是您的第一个元素。如果树(或多或少)平衡,则运行时为O(log n),在最坏情况下(完全左倾树)为O(n)。同样,最大的元素位于最右边的节点,没有正确的子节点。

中位数是位于中间的元素,即具有与其左侧和右侧相同数量的元素。除非您的节点注释了子节点数,否则我无法在O(log n)中看到实现中位数的方法。 CLRS:算法简介将为您提供完整的帐户。