Největší strom binárního vyhledávání v binárním stromem
Existují dva způsoby, jak můžeme tento problém přístupu,
i) Největší BST není vyvolaná (Z uzlu, všechny její děti nemusí splňovat podmínku BST)
ii) Největší BST indukované (Z uzlu, budou všechny její děti splňovat podmínku BST)
Budeme diskutovat o největší BST (nevyvolá) zde. Budeme sledovat přístup zdola nahoru (Post pořadí traversal), jak vyřešit tento.
a) Dosáhnout uzel list
b) uzel stromu (z listu) vrátí objekt TreeNodeHelper, který má následující pole v něm.
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) Původně z koncového uzlu, uzly = 1, isBST = true, MINVALUE = MAXVALUE = node.data. A dále uzly Počet se zvyšuje, pokud splňuje podmínku BST.
d) S pomocí tohoto, budeme kontrolovat stav BST s aktuálním uzlu. A budeme opakovat stejná až do kořene.
e) Z každého uzlu budou vráceny dva objekty. jeden pro poslední maximální BST a druhý pro stávající BST uspokojení uzlů. Takže z každého uzlu (nad list) (2 + 2) = 4 (2 na levém podstromu a 2 na pravém podstromu) objekty budou porovnány a dva budou vráceny.
f) konečná maximální Objekt uzlu od kořene bude největší BST
PROBLÉM:
To je problém v tomto přístupu. Zatímco budeme sledovat tento přístup, pokud podstrom, které nesplňují podmínku BST s aktuálním uzlem, nemůžeme jednoduše ignorovat podstrom (iv případě, že má menší počet uzlů). Například
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
Z koncové uzly (20110) objekty budou testovány pomocí uzlu (105), že splňuje podmínku. Ale když dosáhne uzlu (95) koncový uzel (20) nesplňuje podmínku BST. Vzhledem k tomu, je toto řešení pro BST (není indukované) neměli bychom ignorovat uzlu (105) a uzel (110), který splňuje podmínku. Takže z uzlu (95), musíme znovu ustoupit testuje stav BST a chytit ty uzly (105, 110).
Kompletní kód pro tuto realizaci je k dispozici v tomto odkazu
https://github.com/dineshappavoo/Implementation/tree/master/LARGEST_BST_IN_BT_NOT_INDUCED_VER1.0