CEL MAI MARE CAUTARE Binar TREE a arborelui:
Există două modalități prin care putem aborda această problemă,
i) Cel mai mare BST nu a indus (de la un nod, toți copiii săi nu trebuie să îndeplinească condiția BST)
ii) Cel mai mare BST indusă (de la un nod, toți copiii săi vor satisface condiția BST)
Vom discuta despre cea mai mare BST (Nu indusă) aici. Vom urmări abordarea de jos în sus (post comanda parcurgeri) pentru a rezolva acest lucru.
a) atinge nodul frunză
b) Un nod arbore (din frunze) va returna un obiect TreeNodeHelper care are următoarele câmpuri în ea.
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) Inițial din nodul frunză, noduri = 1, isBST = true, MINVALUE = MAXVALUE = node.data. Și în plus, nodurile COUNT vor fi majorate în cazul în care îndeplinește condiția BST.
d) Cu ajutorul acestui fapt, vom verifica starea BST cu nodul curent. Și vom repeta același lucru până la rădăcină.
e) De la fiecare nod două obiecte vor fi returnate. una pentru ultima BST maximă și alta pentru curent BST noduri satisfăcătoare. Deci, de la fiecare nod (deasupra frunzei) (2 + 2) = 4 (2 pentru subramificație stâng și 2 pentru sub copac dreapta) obiecte vor fi comparate și două vor fi returnate.
f) final obiect maxim nodului de rădăcină va fi cel mai mare BST
PROBLEMĂ:
Există o problemă în această abordare. În timp ce în urma acestei abordări, în cazul în care un subarborele nu îndeplinește condiția BST cu nodul curent, nu putem ignora pur și simplu subarbore (chiar și are un număr mai mic de noduri). De exemplu
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
Din nodurile frunză (20110) obiectele vor fi testate cu nod (105), acesta îndeplinește condiția. Dar când ajunge la nodul (95) nodul frunză (20) nu îndeplinește condiția BST. Deoarece această soluție este BST (nu a indus) nu ar trebui să ignore nod (105) și nodul (110) care satisface condiția. Deci, de la nodul (95), trebuie să ne intoarcem din nou de testare condiție BST și captura aceste noduri (105, 110).
Codul complet pentru această implementare este disponibil în acest link
https://github.com/dineshappavoo/Implementation/tree/master/LARGEST_BST_IN_BT_NOT_INDUCED_VER1.0