我正在尝试为该问题编写算法:
使用O(n)时间和O(1)额外空间将三个二叉搜索树合并到一个排序的数组中。
我认为直接的答案是同时对所有三棵树进行有序遍历,并在遍历时比较元素。但是,如何同时在所有三棵树中进行遍历呢?尤其是当树木没有全部相同数量的元素时。
答案 0 :(得分:2)
您的想法似乎正确。 在每棵树中,维护一个指针(迭代器)。 最初,迭代器应指向树的最左侧节点。
在每次迭代中,选择三个当前指针下的最小元素(时间和内存为O(1))。 然后将该最小值放入结果数组中。 之后,前进相应的指针,使其指向树的最左侧未访问元素。 为了能够在O(1)内存中执行此操作,该树应该允许某种方式转到下一个未访问的元素:在每个节点中都有一个指向父级的指针就足够了。
进行此类迭代,直到访问所有节点为止。
遍历n个元素的整个树需要O(n)时间:有n-1个边,并且该过程沿每个边移动两次,一次上移一次,一次下移。 这样得出的复杂度为3 * O(n)= O(n)。
找到下一个未访问节点的算法如下。 请注意,当我们在节点上时,其左子树已被完全访问。 步骤如下:
尽管没有未访问的合适孩子,但请向上一次找父母。 如果这样做,我们往上走(在左边的孩子那里),就在父母那里停下来。 如果我们是根源,请终止遍历。
假设我们还没有停下来,那是个合适的孩子。 去那里。 然后,在有一个左孩子的情况下,转到左孩子。 停止。
掌握它的最好方法可能是可视化二叉搜索树的一些非平凡图片上的步骤。例如,tree traversal上的Wikipedia文章中有解释性图片。