1373. 二叉搜索子树的最大键值和

深度优先遍历 DFS

解题思路

  1. 从下往上,后序遍历求解;

  2. 本题关键点在于判断一棵子树是否是 BST

  3. BST = 左子树是 BST && 右子树是 BST && 左子树最大值 < 根结点值 && 右子树最小值 >= 根结点值

复杂度

  1. 时间复杂度:O(n)n 是二叉树结点数目,每个结点只需被遍历一次;

  2. 空间复杂度:O(h)h 是二叉树的高度,递归需要是用栈,栈的深度取决于二叉树的高度;

代码实现

var maxSumBST = function (root) {
    let dfs = (root) => {
        if (root == null) return {
            isBST: true, // 返回以 root 为根的二叉树是不是 BST 如果是的话则为 true 否则为 false
            min: Infinity, // 返回以 root 为根的这棵 BST 的最小值
            max: -Infinity, // 返回以 root 为根的这棵 BST 的最大值
            sum: 0, // 返回以 root 为根的这棵 BST 所有节点之和 
        };

        // 递归计算左右子树
        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 };
        }
    };

    let maxSum = 0;
    dfs(root);

    return maxSum;
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 深度优先遍历 DFS
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现