二分木における最大の二分探索木:
この問題にアプローチするには 2 つの方法があります。
i) 誘導されない最大の BST (ノードから、そのすべての子が BST 条件を満たす必要はない)
ii) 誘導される最大の BST (ノードから、そのすべての子が BST 条件を満たす)
ここでは、最大の BST(Not Induced) について説明します。これを解決するために、ボトムアップ アプローチ (ポスト オーダー トラバーサル) に従います。
a) 葉ノードに到達する
b) ツリー ノード (リーフから) は、次のフィールドを持つ 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;
}
}
c) 最初は葉ノードから、 nodes=1,isBST=true,minValue=maxValue=node.data . さらに、BST条件を満たす場合、ノード数が増加します。
d) これを利用して、現在のノードで BST の状態を確認します。そして、ルートまで同じことを繰り返します。
e) 各ノードから 2 つのオブジェクトが返されます。1 つは最後の最大 BST 用で、もう 1 つは現在の BST を満たすノード用です。したがって、各ノード (葉の上) (2+2)=4 (左側のサブツリーに 2 つ、右側のサブツリーに 2 つ) のオブジェクトが比較され、2 つが返されます。
f) ルートからの最終的な最大ノード オブジェクトは、最大の BST になります。
問題:
このアプローチには問題があります。このアプローチに従いながら、サブツリーが現在のノードで BST 条件を満たさない場合、サブツリーを単純に無視することはできません (ノードの数が少ない場合でも)。例えば
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
リーフ ノード (20,110) から、オブジェクトはノード (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