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