[英]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.