GRANDE BINARIO RICERCA ALBERO IN UN ALBERO BINARIO:
Ci sono due modi in cui possiamo affrontare questo problema,
i) più grande BST non indotta (da un nodo, tutti i suoi figli non devono soddisfare la condizione BST)
ii) più grande BST indotti (Da un nodo, tutti i suoi figli soddisfare la condizione BST)
Si discuterà sul più grande BST (non indotta) qui. Seguiremo approccio bottom up (Post ordine di attraversamento) per risolvere questo problema.
a) pervenire al nodo foglia
b) Un nodo albero (dalla foglia) restituirà un oggetto TreeNodeHelper che ha i seguenti campi in esso.
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) Inizialmente dal nodo foglia, nodi = 1, isBST = true, minValue = maxValue = node.data. E ancora, i nodi contare saranno aumentate se soddisfa la condizione BST.
d) Con l'aiuto di questo, si provvederà a controllare la condizione BST con nodo corrente. E noi ripetere la stessa fino a radice.
e) da ogni nodo saranno restituiti due oggetti. uno per ultima BST massimo e un altro per BST corrente nodi soddisfacenti. Così da ogni nodo (sopra foglio) (2 + 2) = 4 (2 per sottoalbero sinistro e 2 per l'albero secondario destra) oggetti verranno confrontati e due saranno restituiti.
f) L'oggetto nodo finale massimo dalla radice sarà il più grande BST
PROBLEMA:
C'è un problema in questo approccio. Pur seguendo questo approccio, se una sottostruttura non è soddisfacente la condizione BST con il nodo corrente, non possiamo semplicemente ignorare la sottostruttura (anche ha meno numero di nodi). Per esempio
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
Dai nodi foglia (20.110) gli oggetti saranno testati con il nodo (105), soddisfa la condizione. Ma quando raggiunge il nodo (95) del nodo foglia (20) non soddisfa la condizione BST. Poiché questa soluzione è per BST (non indotta) non dovremmo ignorare nodo (105) e il nodo (110) che soddisfa la condizione. Così dal nodo (95) dobbiamo tornare indietro di nuovo far controllare lo stato BST e catturare quei nodi (105, 110).
Il codice completo per questa implementazione è disponibile in questo link
https://github.com/dineshappavoo/Implementation/tree/master/LARGEST_BST_IN_BT_NOT_INDUCED_VER1.0