我不知道如何解决这个问题。
返回指向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;
答案 0 :(得分:0)
如果树完全平衡(任何必要的不平衡限于序列的末尾),您可以通过使用n的二进制表示的位模式来指导沿着节点向下走。由于您只是要求提供一般性指导,我会将其留在那里,而不是提供代码。
如果树没有完美平衡,你必须先行走O(n)深度。或者添加一个索引(它有自己的维护成本)。
答案 1 :(得分:0)
BST中最小的元素在哪里?它是最左边的节点,没有左子节点。因此,请按照左侧链接,直到您点击NULL并且这是您的第一个元素。如果树(或多或少)平衡,则运行时为O(log n),在最坏情况下(完全左倾树)为O(n)。同样,最大的元素位于最右边的节点,没有正确的子节点。
中位数是位于中间的元素,即具有与其左侧和右侧相同数量的元素。除非您的节点注释了子节点数,否则我无法在O(log n)中看到实现中位数的方法。 CLRS:算法简介将为您提供完整的帐户。