二叉树中最大的二叉搜索树:
我们有两种方法可以解决这个问题,
i) 最大 BST 未诱导(从一个节点,它的所有子节点不需要满足 BST 条件)
ii) 最大 BST 诱导(从一个节点,它的所有子节点都将满足 BST 条件)
我们将在这里讨论最大的 BST(未诱导)。我们将采用自下而上的方法(后序遍历)来解决这个问题。
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 条件。我们将重复相同的操作直到 root。
e) 从每个节点返回两个对象。一个用于最后的最大 BST,另一个用于当前 BST 满足节点。因此,从每个节点(叶上方)(2+2)=4(左子树为 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