题目
给定一个二叉树,返回子树中最大搜索二叉树的节点个数和最大搜索二叉树的顶点
- 构造二叉树递归结构,从左右子树拿相关信息,处理好base case,然后根据信息更新当前节点信息(当前节点要考虑叶子节点和其他节点)
- 如果当前节点不是搜索二叉树的顶点,从左右子树拿信息
- 如果当前节点是搜索二叉树,从左右子树拿信息后,那么当前节点构成的就是目前的最大搜索二叉树,然后更新相关信息
class Info {
constructor(maxBSTHead, isBST, min, max, maxBSTSize) {
this.maxBSTHead = maxBSTHead;
this.isBST = isBST;
this.min = min;
this.max = max;
this.maxBSTSize = maxBSTSize;
}
}
function process(x) {
if (x === null) {
return null;
}
const leftInfo = process(x.left);
const rightInfo = process(x.right);
let maxBSTHead = null,
isBST = false,
min = x.value,
max = x.value,
maxBSTSize = 0;
// 比较最值
if (leftInfo !== null) {
min = Math.min(x.value, leftInfo.min);
max = Math.max(x.value, leftInfo.max);
}
if (rightInfo !== null) {
min = Math.min(min, rightInfo.min);
max = Math.max(max, rightInfo.max);
}
// 比较节点数和节点
if (leftInfo !== null) {
maxBSTSize = leftInfo.maxBSTSize;
maxBSTHead = leftInfo.maxBSTHead;
}
if (rightInfo !== null && rightInfo.maxBSTSize > maxBSTSize) {
maxBSTSize = rightInfo.maxBSTSize;
maxBSTHead = rightInfo.maxBSTHead;
}
// 判断当前顶点构成的树是否是搜索二叉树
// 第一个if判断左右树是否都是搜索二叉树
if (
(leftInfo == null || leftInfo.isBST) &&
(rightInfo === null || rightInfo.isBST)
) {
// 以当前节点构成的树也是搜索二叉树
if (
(leftInfo === null || leftInfo.max < x.value) &&
(rightInfo === null || rightInfo.min > x.value)
) {
isBST = true;
maxBSTHead = x; // maxBSTHead 在这设置是因为首先你得存在搜索二叉树
maxBSTSize = (leftInfo.maxBSTSize ?? 0) + 1 + (rightInfo.maxBSTSize ?? 0);
}
}
return new Info(maxBSTHead, isBST, min, max, maxBSTSize);
}