在BST中查找所有连续数字对

时间:2015-12-16 22:21:12

标签: binary-search-tree

我需要编写一个能够在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只包含整数。

谢谢!

1 个答案:

答案 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
}