-
问题描述:
找到一棵二叉树中,最大的搜索二叉子树,返回最大搜索二叉子树的节点个数。
需要解决的问题:- 判断二叉树是搜索二叉树
- 并且返回最大搜索二叉树的节点数
什么是搜索二叉树?
搜索二叉树俗称排序二叉树,通过这个名字可以大概了解就是左孩子的数值小于双亲结点,并且满足右孩子节点的数值大于双亲节点。同时子树也满足这个特点。对应这个点也是我们解决问题的一个依据点。
返回最大搜索二叉树?
这个如果我们要一一遍历二叉树,通过某种记录方法,这样时间复杂度增加同时,还需要编写各种方法体判断搜索二叉树,以及比较节点数的方法等等
这样一来不仅增加我们解决问题的难度,同时还有可能打乱思路。换个思路,假设每一个节点都能反映出对应左右孩子的一些数据,那么我们是否可以利用这些数据进行搜索二叉树的判断呢?同时进行比较,逐层下去,最终留下的那个便是最大搜索二叉树。
思路:
1.首先要定义一个二叉树的结构。
2.再定义一个结构体编写返回判断搜索二叉树所需要的数据
3.进行方法体的编写
4.利用递归思想逐级比较
具体实现代码:
// 1
public static class Node {
public int value;
public Node right;
public Node left;
public Node(int res) {
value = res;
}
}
// 3
public static Node getMaxTree(Node head) {
return process(head).maxBSTHead;
}
// 2
public static class Type {
public Node maxBSTHead;
public int maxBSTSize;
public int min;
public int max;
public Type(Node maxBSTHead, int maxBSTSize, int min, int max) {
this.maxBSTHead = maxBSTHead;
this.maxBSTSize = maxBSTSize;
this.min = min;
this.max = max;
}
}
// 4
public static Type process(Node head) {
if (head == null)
return new Type(null, 0, Integer.MAX_VALUE, Integer.MIN_VALUE);
Type leftNode = process(head.left);
Type rightNode = process(head.right);
int min = Math.min(head.value, Math.min(leftNode.min, rightNode.min));
int max = Math.max(head.value, Math.max(leftNode.max, rightNode.max));
int maxBSTSize = Math.max(rightNode.maxBSTSize, leftNode.maxBSTSize);
Node maxBSThead = leftNode.maxBSTSize > rightNode.maxBSTSize ? leftNode.maxBSTHead : rightNode.maxBSTHead;
if (leftNode.maxBSTHead == head.left && rightNode.maxBSTHead == head.right
&& leftNode.maxBSTHead.value < head.value && head.value < rightNode.maxBSTHead.value) {
maxBSThead=head;
maxBSTSize=leftNode.maxBSTSize+1+rightNode.maxBSTSize;
}
return new Type(maxBSThead, maxBSTSize, min, max);
}