在AVL树中查找第k个最小节点

时间:2013-11-21 14:08:29

标签: algorithm min avl-tree

我现在已经构建了一个AVL树,这是一个在AVL树中找到第k个最小节点的函数 (k从0开始) 代码:

int kthMin(int k)
{
    int input=k+1;
    int count=0;
    return KthElement(root,count,input);
}

int KthElement( IAVLTreeNode * root, int count, int k)
{
    if( root)
    {
        KthElement(root->getLeft(), count,k);
        count ++;
        if( count == k)
            return root->getKey();
        KthElement(root->getRight(),count,k);
    }
    return NULL;
}

它可以找到一些正确的节点,但有些可能会失败,任何人都可以帮我调试这个> 感谢

2 个答案:

答案 0 :(得分:0)

从根开始,在向左递归后,count将为1,无论左边有多少个节点。

您需要在递归调用中更改count,因此更改count将通过引用传递(假设这是C ++)。

int KthElement( IAVLTreeNode * root, int &count, int k)

(我认为不需要通过引用来传递任何其他代码更改)。

除此之外,您还需要实际返回递归调用中生成的值,即更改:

KthElement(root->getLeft(), count, k);

为:

int val = KthElement(root->getLeft(), count, k);
if (val != 0)
   return val;

同样适用于getRight

注意我使用的是0,而不是NULLNULL通常用于引用空指针,并转换为0 int(后者在使用int时是首选)。

这当然假设0不是树中的有效节点(否则您的代码将无效)。如果是,则需要找到另一个要使用的值,或者指向该节点的指针(在这种情况下,您可以使用NULL表示未找到)。

答案 1 :(得分:0)

以下是任何树中Kth最小节点的简单算法: -

count=0, found=false;

kthElement(Node p,int k) {

    if(p==NULL)
        return -1

    else {

        value = kthElement(p.left)             
        if(found)
            return value 

        count++
        if(count==k) {
            found = true
            return p.value
        }

        value = kthElement(p.right)
        return value
    }
}

注意: - 使用全局变量是关键。