二叉搜索子树的最大键值和 (思路还是不太顺)
思路
- 判断这颗树是不是二叉搜索树
- 它的左右子树是不是二叉搜索树
- 左右子树加上自己是不是二叉搜索树
- 如果是二叉搜索树,判断结点数之和和最大的值比,获取最大值
所以:
3. 需要判断它的左右子树是不是儿叉搜索树,所以需要一个值isBST
来存储,
4. 要判断它是不是二叉搜索树,就要判断根节点的值是否大于左子树的最大值,且小于右子树的最小值,所以还需要存储每棵树的最大值和最小值,max和min (这里想到的是max是递归找到树的最右结点,min是递归找到树的最左结点,答案的思路还是有点模糊)
5. 还要记录这棵树的结点值之和
var max = 0;
var maxSumBST = function(root) {
let maxSum = 0;
/* 返回一个对象,其中属性
isBST 返回以 root 为根的二叉树是不是 BST 如果是的话则为true 否则为false
min 返回以 root 为根的这棵 BST 的最小值
max 返回以 root 为根的这棵 BST 的最大值
sum 返回以 root 为根的这棵 BST 所有节点之和
*/
let dfs = (root) => {
// base case
if (root == null) {
return {
isBST: true,
min: Infinity,
max: -Infinity,
sum: 0,
};
}
// 递归计算左右子树
let left = dfs(root.left);
let right = dfs(root.right);
if (
left.isBST &&
right.isBST &&
root.val > left.max &&
root.val < right.min
) {
// 计算以 root 为根的这棵 BST 所有节点之和
let sum = left.sum + right.sum + root.val;
maxSum = Math.max(sum, maxSum);
return {
// 以root为根的二叉树是BST
isBST: true,
// 计算以 root 为根的这棵 BST 的最小值
min: Math.min(left.min, root.val),
// 计算以 root 为根的这棵 BST 的最大值
max: Math.max(right.max, root.val),
sum,
};
} else {
// 以 root 为根的二叉树不是 BST
return {
isBST: false,
};
}
};
dfs(root);
return maxSum;
};