RECHERCHE PLUS GRANDE TREE BINARY DANS UN ARBRE BINARY:
Il y a deux façons dont nous pouvons aborder ce problème,
i) La plus grande BST n'induit (à partir d'un noeud, tous ses enfants ne sont pas soumises à la condition de BST)
ii) la plus grande BST induites (d'un nœud, tous ses enfants satisfaire à la condition de BST)
Nous allons discuter de la plus grande BST (pas Induced) ici. Nous allons approche FOLLOW ascendante (Publier traversal) pour résoudre ce problème.
a) atteindre le noeud feuille
b) un noeud d'arborescence (à partir de la feuille) retourne un objet TreeNodeHelper qui a les champs suivants en elle.
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;
}
}
c) Dans un premier temps depuis le noeud de feuille, les nœuds = 1, isBST = true, minValue = maxValue = node.data. Et plus loin, les noeuds COUNT seront augmentés si elle satisfait à la condition de BST.
d) Avec l'aide de cela, nous allons vérifier l'état de BST avec noeud courant. Et nous allons répéter la même jusqu'à la racine.
e) De chaque nœud deux objets seront renvoyés. une dernière pour la BST et un autre maximum pour les noeuds de courant BST satisfaisants. Donc, à partir de chaque nœud (au-dessus des feuilles) (2 + 2) = 4 (2 pour sous-arbre gauche et 2 pour sous-arbre droit) objets seront comparés et deux seront retournés.
f) L'objet de noeud de la racine finale maximale sera le plus grand BST
PROBLÈME:
Il y a un problème dans cette approche. En suivant cette approche, si un sous-arbre ne satisfait pas la condition de BST avec le nœud actuel, on ne peut passer sous silence le sous-arbre (même il a moins de nombre de nœuds). Par exemple
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
A partir des nœuds feuilles (20110) les objets seront testés avec le noeud (105), il satisfait à la condition. Mais quand il atteint le noeud (95), le nœud feuille (20) ne satisfait pas à la condition de BST. Étant donné que cette solution est BST (pas induite) il ne faut pas ignorer le noeud (105) et le noeud (110) qui satisfait la condition. Donc, à partir du noeud (95), nous devons revenir en arrière tester à nouveau l'état de BST et attraper ces noeuds (105, 110).
Le code complet pour cette mise en œuvre est disponible dans ce lien
https://github.com/dineshappavoo/Implementation/tree/master/LARGEST_BST_IN_BT_NOT_INDUCED_VER1.0