КРУПНЕЙШИЙ бинарное дерево поиска в бинарном дереве:
Есть два способа, которыми мы можем подойти к этой проблеме,
я) Самый большой BST не индуцируется (от узла, все его дети не должны удовлетворять условию BST)
б) сам большой БСТ индуцированный (от узла, все его дети будут удовлетворять условию BST)
Мы будем обсуждать о наибольшем BST (не индуцируется) здесь. Мы будем следить за подход "снизу вверх" (Post порядок обхода), чтобы решить эту проблему.
а) Reach узел листа
б) узел дерева (от листа) будет возвращать объект 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;
}
}
в) Изначально из листового узла, узлы = 1, isBST = верно, MinValue = MaxValue = node.data. И далее, узлы Count будет увеличено, если она удовлетворяет условию BST.
d) С помощью этого, мы будем проверять состояние BST с текущим узлом. И мы будем повторять то же самое до корня.
е) Из каждого узла два объекта будет возвращен. один за последний максимальный BST и другой для тока BST удовлетворения узлов. Таким образом, от каждого узла (выше) листа (2 + 2) = 4 (2 для левого поддерева и 2 для правого дерева к югу) объекты будут сопоставлены и два будут возвращены.
е) Конечный максимальный объект узла от корня будет самым большим БСТ
ПРОБЛЕМА:
Существует проблема в этом подходе. Следуя такой подход, если поддерево не удовлетворяет условию BST с текущим узлом, мы не можем просто игнорировать поддерево (даже имеет меньшее количество узлов). Например
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
От узлов листа (20110) объекты будут испытаны с узлом (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