本题解采用深度优先搜索(DFS)方法来找出具有最大键值和的二叉搜索子树。对于每个节点,我们检查其是否能形成一个二叉搜索树(BST)。具体来说,DFS函数返回一个三元组:(子树的和, 子树的最小值, 子树的最大值)。若某个子树不是BST,我们使用一个非常小的标记值(float('-inf'))来标记其和,这样其父节点就不会错误地认为它可以形成BST。在递归过程中,我们更新全局变量ans来保持迄今为止找到的最大键值和。这种方法确保每个节点最多被访问一次。
时间复杂度: O(n)
空间复杂度: O(h),其中h是树的高度
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxSumBST(self, root: Optional[TreeNode]) -> int:
ans = 0
def dfs(root):
nonlocal ans
if not root.left:
if not root.right:
ans = max(ans, root.val) # Update max sum with the value of the leaf
return root.val, root.val, root.val # Leaf is a valid BST
else:
sum2, Rmin, Rmax = dfs(root.right)
if sum2 >= - 10 ** 10 and root.val < Rmin:
ans = max(ans, root.val + sum2)
return root.val + sum2, root.val, Rmax
else:
return float("-inf"), -1, -1
elif not root.right:
sum1, Lmin, Lmax = dfs(root.left)
if sum1 >= - 10 ** 10 and root.val > Lmax:
ans = max(ans, root.val + sum1)
return root.val + sum1, Lmin, root.val
else:
return float("-inf"), -1, -1
else:
sum1, Lmin, Lmax = dfs(root.left)
sum2, Rmin, Rmax = dfs(root.right)
if sum1 >= - 10 ** 10 and sum2 >= - 10 ** 10 and Lmax < root.val < Rmin:
ans = max(ans, root.val + sum1 + sum2)
return root.val + sum1 + sum2, Lmin, Rmax
else:
return float("-inf"), -1, -1
dfs(root)
return ans