КРУПНЕЙШИЙ БИНАРНЫЙ ПОИСК ДЕРЕВА В БИНАРНОМ ДЕРЕВЕ:
Есть два способа решения этой проблемы:
i) Самый большой BST не индуцирован (От узла все его дочерние элементы не должны удовлетворять условию BST)
ii) Наибольший индуцированный BST (из узла все его дочерние элементы будут удовлетворять условию BST)
Мы поговорим о самом большом BST (не индуцированном) здесь. Для решения этой проблемы мы будем использовать подход «снизу вверх» (обратный заказ).
а) Достичь листового узла
b) Узел дерева (из листа) вернет объект TreeNodeHelper, в котором есть следующие поля.
public static class TreeNodeHelper {
TreeNode node;
int nodes;
Integer maxValue;
Integer minValue;
boolean isBST;
public TreeNodeHelper() {}
public TreeNodeHelper(TreeNode node, int nodes, Integer maxValue, Integer minValue, boolean isBST) {
this.node = node;
this.nodes = nodes;
this.maxValue = maxValue;
this.minValue = minValue;
this.isBST = isBST;
}
}
в) Первоначально из конечного узла node = 1 isBST = true, minValue = maxValue = node.data. Кроме того, количество узлов будет увеличено, если оно удовлетворяет условию BST.
d) С помощью этого мы проверим состояние BST с текущим узлом. И мы повторим то же самое до корня.
e) Из каждого узла будут возвращены два объекта. один для последнего максимального BST и еще один для текущих узлов, удовлетворяющих BST. Таким образом, из каждого узла (над листом) (2 + 2) = 4 (2 для левого поддерева и 2 для правого поддерева) будут сравниваться объекты и возвращаться два.
f) Последний максимальный объект узла от root будет самым большим BST
ПРОБЛЕМА:
В этом подходе есть проблема. Следуя этому подходу, если поддерево не удовлетворяет условию BST с текущим узлом, мы не можем просто проигнорировать поддерево (даже если оно имеет меньшее количество узлов). Например
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
Из листовых узлов (20,110) объекты будут проверены с помощью узла (105), он удовлетворяет условию. Но когда он достигает узла (95), листовой узел (20) не удовлетворяет условию BST. Поскольку это решение для BST (не индуцировано), мы не должны игнорировать узел (105) и узел (110), который удовлетворяет условию. Таким образом, из узла (95) мы должны вернуться назад, проверяя состояние BST, и перехватить эти узлы (105, 110).
Полный код для этой реализации доступен по этой ссылке
https://github.com/dineshappavoo/Implementation/tree/master/LARGEST_BST_IN_BT_NOT_INDUCED_VER1.0