Поиск наименьшего общего предка в нерекурсивной версии двоичного дерева - Java

Я ищу нерекурсивную версию алгоритма поиска наименее общего предка в отсортированном двоичном дереве, написанном на Java. Все, что я нашел, это только рекурсивная версия (даже на stackru и на других сайтах).

Может кто-нибудь написать или направить меня к нерекурсивной версии (используя цикл while)? Также напишите, если эта версия более эффективна с точки зрения сложности времени?

1 ответ

Просто случайно увидел этот давно забытый вопрос.

Вы имеете в виду что-то вроде, если вам дано дерево:

       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

что-то вроде того?

2 способа дать (все предполагают, что предоставленные узлы находятся в дереве):

Если есть ссылка на родителя (т. Е. Вы указываете с B обратно на A), то решение легко, аналогично нахождению пересекающегося связанного списка:

найти глубину Node1 и Node2, предполагая, что глубина D1 а также D2, Найди разницу между D1 а также D2 (при условии, d). Есть указатель на Node1 и Node2 (предположим, p1 и p2). Для узла с большей глубиной перейдите к родительскому d-му разу. С этой точки зрения, p1 а также p2 будет иметь такую ​​же глубину ниже предка. Просто есть простой цикл для навигации как p1 а также p2 до родителя, пока вы не нажмете на узел, который 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

Основная идея заключается в том, что, учитывая, что это бинарное дерево поиска, если два узла больше или меньше текущего узла, оно переходит к одному и тому же дочернему дереву. Таким образом, общим предком является узел, в котором два значения переходят к разным дочерним элементам, т. Е. Когда одно меньше текущего узла, а другое больше.

Другие вопросы по тегам