簡體   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