最少共同的祖先搜索二叉树非递归版本 - Java

时间:2014-12-21 14:26:14

标签: java non-recursive least-common-ancestor

我正在搜索一个非递归算法版本,用于在用Java编写的已排序二进制树中查找最不常见的祖先。 我找到的所有东西都只是递归版本(甚至在stackoverflow和其他网站上)。

有人可以编写或指导我使用非递归版本(使用while循环)吗? 如果这个版本在时间复杂度方面更有效,还要写一下吗?

1 个答案:

答案 0 :(得分:2)

碰巧看到这个被遗忘的问题。

如果给你一棵树,你的意思是:

       A
   B       C
 D   E   F   G
H I J K L M N O

commonAncestor(L,G) = C
commonAncestor(H,O) = A
commonAncestor(B,H) = B

类似的东西?

要给出的两种方法(所有假设所提供的节点都在树中):

如果有父亲的链接(即你指向B回到A),那么解决方案很简单,类似于查找相交的链表:

找到Node1和Node2的深度,假设深度为D1D2。找出D1D2之间的差异(假设d)。有指向Node1和Node2的指针(假设为p1和p2)。对于具有更高深度的节点,导航到父d次。此时,p1p2将在祖先下方具有相同的深度。只需一个简单的循环即可将p1p2导航到父级,直到您点击p1 == p2的节点。

如果节点中没有父链接,您可以迭代地导航树:

currentNode = root;
while (true) {
    if ((currentNode > node1 && currentNode < node2) ||
        (currentNode < node1 && currentNode > node2)) {
        break;  // current node is the common ancestor, as node1 and node2 
                // will go to different sub-tree
    } else if (currentNode > node1) {
        currentNode = currentNode.left;
    } else { // currentNode < node1/2
        currentNode = currentNode.right;
    }
}

// currentNode will be the answer you want

基本思想是,假设它是二叉搜索树,如果两个节点都比当前节点更大/更小,它将转到同一个子树。因此,共同的祖先是两个值传递给不同子节点的节点,即当一个小于当前节点而另一个小于当前节点时。