在Java中镜像二进制树和阻塞队列之间的任何连接

时间:2013-04-09 08:38:07

标签: java multithreading recursion concurrency tree

我认为镜像二叉树在Java中是直接的,如:

 http://stackoverflow.com/questions/4366251/mirror-image-of-a-binary-tree

但是,我遇到了一个面试问题,将这个问题与Java中的多线程相关联,即阻塞队列(java.util.concurrent)

据我所知,我没有看到这两个概念之间有明显的联系,有人能给我一个暗示,我可能会遗漏一些东西吗?谢谢!

1 个答案:

答案 0 :(得分:0)

一般

树镜像的递归结构揭示了解决方案。首先给出根节点,我们在主线程上交换左子节点和右子节点。现在我们在左侧节点上应用镜像,在右侧节点上应用镜像。但镜像左边节点与镜像右边节点无关,因此我们可以在不同的线程上进行镜像。

遵守以下规则以避免线程过多。当前线程交换当前正在操作的节点的左右子节点。然后它将新左子项的镜像委托给新线程,并继续处理右侧节点的镜像。

请注意,对于我们遇到的每个节点,我们都会生成一个新线程。因此,如果树是不平衡的并且只留下了子节点,我们会生成O(n)个线程,其中n是树中的节点数。但是,我们可以维护一个线程池,这样一旦任何线程到达叶子节点,它就会返回到池中。如果树是平衡的,那么每个线程都以O(log n)步骤终止,所以我们有O(n / log n)线程的顺序(我认为?)。

使用阻止队列

您可以将阻塞队列与此线程池的想法结合使用,将左侧和右侧节点交换到队列后放置,然后工作人员可以将它们取出并处理它们,然后返回新的左右子节点该子节点返回队列以供另一个线程处理。一旦命中叶子节点,就没有左右子节点,因此队列中没有任何内容。当队列为空时,镜像已完成。