我需要编写一个能够在BST中找到所有连续数字对的代码。
例如:让我们用键9取得BST T,T.left.key = 8,T.right.key = 19.只有一对 - (8,9)。
我想到的天真解决方案是在BST上进行任何遍历(pre,in,post),并为每个节点找到它的后继和前任,如果其中一个或两个连续到节点 - 我们& #39;打印出来。但问题是它会 O(n ^ 2),因为我们有n个节点,对于每个节点,我们使用的函数需要 O(h)< / strong>,在最坏的情况下h~n。
第二种解决方案是将所有元素复制到数组中,并查找数组中的连续数字。这里我们使用 O(n)额外空间,但运行时更好 - O(n)。
你能帮我找一个有效的算法来做吗?我试图考虑不使用额外空间的算法,其运行时间优于 O(n ^ 2)
*所需的输出是这些对的数量(无需打印对)。
* BST中任何2个连续的整数都是一对。
* BST只包含整数。
谢谢!
答案 0 :(得分:0)
为什么不直接进行顺序遍历和计数对?您需要一个全局变量来跟踪最后一个数字,并且您需要将其初始化为不小于第一个数字的某个数字(例如,根目录)那个树)。我的意思是:
// Last item
int last;
// Recursive function for in-order traversal
int countPairs (whichever_type treeRoot)
{
int r = 0; // Return value
if (treeRoot.leftChild != null)
r = r + countPairs (treeRoot.leftChild);
if (treeRoot.value == last + 1)
r = r + 1;
last = treeRoot.value;
if (treeRoot.rightChild != null)
r = r + countPairs (treeRoot.rightChild);
return r; // Edit 2016-03-02: This line was missing
}
// Main function
main (whichever_type treeRoot)
{
int r;
if (treeRoot == null)
r = 0;
else
{
last = treeRoot.value; // to make sure this is not one less than the lowest element
r = countPairs (treeRoot);
}
// Done. Now the variable r contains the result
}