算法思想:
建立一个拓扑贡献记录,每个节点左右两侧的值为对于某个节点,此节点拓扑贡献数,如下图:
从图中可以看出,所有的叶子节点对于5来说,他左右两边对5的拓扑贡献均为0,因为他左右两边没有节点。
a图中,在3处来说,对于5来说2符合二叉搜索树的条件,所以他贡献一个,同理4也贡献一个,所以3左右两边各一个。3节点自身也贡献一个,对于5来说左边的节点贡献了3个。右边同理。
图b,12,7大于5,8大于6不满足二叉搜索树条件,所以不能要,也就是不贡献.
那么我们只需要找到某节点,它的左右贡献值最大,那么它就是最大拓扑结构的头结点,左+右+1就是最大值
若在对于以b为头结点的最大子串上加上一个a,让他以a为头结点,若b<a,因为c(c代表b的左子串,不止一个)<b,那么c所代表的左孩子都小于a,满足搜索二叉树条件,所以c对b的贡献可以变成对a的贡献。
对于b的右孩子,若f是大于a的,那么f的贡献就要去除,对于小于a的节点的左孩子也是小于a的,贡献可以直接加上。
JAVA代码:
package chapter_3_binarytreeproblem;
import java.util.HashMap;
import java.util.Map;
public class Problem_08_BiggestBSTTopologyInTree {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}