3 回答
TA贡献1803条经验 获得超6个赞
一个更简单的解决方案是进行有序遍历并跟踪当前要打印的元素(不打印)。当我们达到k时,打印元素并跳过其余的树遍历。
void findK(Node* p, int* k) {
if(!p || k < 0) return;
findK(p->left, k);
--k;
if(k == 0) {
print p->data;
return;
}
findK(p->right, k);
}
TA贡献1851条经验 获得超5个赞
public int ReturnKthSmallestElement1(int k)
{
Node node = Root;
int count = k;
int sizeOfLeftSubtree = 0;
while(node != null)
{
sizeOfLeftSubtree = node.SizeOfLeftSubtree();
if (sizeOfLeftSubtree + 1 == count)
return node.Value;
else if (sizeOfLeftSubtree < count)
{
node = node.Right;
count -= sizeOfLeftSubtree+1;
}
else
{
node = node.Left;
}
}
return -1;
}
这是我基于上述算法在C#中的实现,只是以为我会发布它,以便人们可以更好地理解它对我有用
谢谢你IVlad
添加回答
举报