我现在已经构建了一个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;
}
它可以找到一些正确的节点,但有些可能会失败,任何人都可以帮我调试这个> 感谢
答案 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
,而不是NULL
。 NULL
通常用于引用空指针,并转换为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
}
}
注意: - 使用全局变量是关键。