给定一颗二叉树的头结点head,返回这个二叉树中最大二叉搜索子树的头结点
代码实现
public class Code02_MaxSubBSTHead {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
public static class Info {
public Node maxSubBSTHead;
public int maxSubBSTSize;
public int min;
public int max;
public Info(Node maxSubBSTHead, int maxSubBSTSize, int min, int max) {
this.maxSubBSTHead = maxSubBSTHead;
this.maxSubBSTSize = maxSubBSTSize;
this.min = min;
this.max = max;
}
}
public static Node maxSubBSTHead(Node head) {
if (head == null) {
return null;
}
return process(head).maxSubBSTHead;
}
private static Info process(Node head) {
if (head == null) {
return null;
}
Info leftInfo = process(head.left);
Info rightInfo = process(head.right);
int min = head.value;
int max = head.value;
int maxSubBSTSize = 0;
Node maxSubBSTHead = null;
if (leftInfo != null) {
min = Math.min(leftInfo.min, min);
max = Math.max(leftInfo.max, max);
maxSubBSTSize = leftInfo.maxSubBSTSize;
maxSubBSTHead = leftInfo.maxSubBSTHead;
}
if (rightInfo != null) {
min = Math.min(rightInfo.min, min);
max = Math.max(rightInfo.max, max);
if (rightInfo.maxSubBSTSize > maxSubBSTSize) {
maxSubBSTHead = rightInfo.maxSubBSTHead;
maxSubBSTSize = rightInfo.maxSubBSTSize;
}
}
// 如果左子树的maxSubBSTHead等于当前节点左孩子节点 并且 右子树的maxSubBSTHead等于当前节点右孩子节点
// 说明左孩子和右孩子都是二叉搜索子树,可以整棵树被当前节点加入
// 并且当前节点加入后仍然是二叉搜索树,则可以将当前节点加入,成为maxSubBSTHead
if ((leftInfo == null ? true : (leftInfo.maxSubBSTHead == head.left && head.value > leftInfo.max))
&&
(rightInfo == null ? true : (rightInfo.maxSubBSTHead == head.right && head.value < rightInfo.min))) {
maxSubBSTHead = head;
maxSubBSTSize = (leftInfo == null ? 0 : leftInfo.maxSubBSTSize) + (rightInfo == null ? 0 : rightInfo.maxSubBSTSize) + 1;
}
return new Info(maxSubBSTHead, maxSubBSTSize, min, max);
}
}