考虑下面的问题:
“从数字流存储最大的5000号”
其中弹簧想到的解决方案是一个二叉搜索树保持在树节点的数量和一次计数达到5000当计数达到5000最小节点的引用计数,每一个新的数量增加可以比在树中最小的项目。 如果更大,可以添加新的号码,然后最小的去除,计算新的最小(这应该是很简单的已经具有先前的最小)。
我的这个解决方案值得关注的是二叉树自然会得到倾斜(因为我只在一侧删除)。
有没有办法解决这个问题,这将不会创建一个非常扭曲的树的方法吗?
如果有人想它,我已经包括了我的解决方案,因此远低于伪代码:
process(number)
{
if (count == 5000 && number > smallest.Value)
{
addNode( root, number)
smallest = deleteNodeAndGetNewSmallest ( root, smallest)
}
}
deleteNodeAndGetNewSmallest( lastSmallest)
{
if ( lastSmallest has parent)
{
if ( lastSmallest has right child)
{
smallest = getMin(lastSmallest.right)
lastSmallest.parent.right = lastSmallest.right
}
else
{
smallest = lastSmallest.parent
}
}
else
{
smallest = getMin(lastSmallest.right)
root = lastSmallest.right
}
count--
return smallest
}
getMin( node)
{
if (node has left)
return getMin(node.left)
else
return node
}
add(number)
{
//standard implementation of add for BST
count++
}