繁体   English   中英

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

[英]Find kth min node in 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;
}

它可以找到一些正确的节点,但是某些节点可能会失败,任何人都可以帮助我调试此>

从根开始,向左递归后,无论左边有多少个节点, 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 ,而不是NULL NULL通常用于引用空指针,并将其转换为0 int (使用int时首选后者)。

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

通常,这是任何树中第K个最小节点的简单算法:-

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
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM