leetcode 1373. Maximum Sum BST in Binary Tree

Given a binary tree root, the task is to return the maximum sum of all keys of any sub-tree which is also a Binary Search Tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

 

Example 1:

 

Input: root = [1,4,3,2,4,2,5,null,null,null,null,null,null,4,6]
Output: 20
Explanation: Maximum sum in a valid Binary search tree is obtained in root node with key equal to 3.

Example 2:

 

Input: root = [4,3,null,1,2]
Output: 2
Explanation: Maximum sum in a valid Binary search tree is obtained in a single root node with key equal to 2.

Example 3:

Input: root = [-4,-2,-5]
Output: 0
Explanation: All values are negatives. Return an empty BST.

Example 4:

Input: root = [2,1,3]
Output: 6

Example 5:

Input: root = [5,4,8,3,null,6,3]
Output: 7

 

Constraints:

  • Each tree has at most 40000 nodes..
  • Each node's value is between [-4 * 10^4 , 4 * 10^4].

题目 求树中 "满足查询树的子树的节点值的和" 的最大值。

遍历树即可。代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def maxSumBST(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        result = [0]
        def LRD(root,result):  #return isBST,sumValue,leftValue,rightValue
            if root is None:
                return True,0,0,0
            isBST,sumValue,leftValue,rightValue = True,root.val,root.val,root.val
            
            leftIsBST,leftSumValue,leftLeftValue,leftRightValue = LRD(root.left,result)
            rightIsBST,rightSumValue,rightLeftValue,rightRightValue = LRD(root.right,result)    
            if root.left :
                if(not leftIsBST or leftRightValue >= root.val): #无效的树,下同
                    return False,0,0,0
                else:
                    leftValue = leftLeftValue
            
            if root.right:
                if (not rightIsBST or rightLeftValue <= root.val):
                    return False,0,0,0
                else:
                    rightValue = rightRightValue
            sumValue += leftSumValue + rightSumValue
            result[0] = max(result[0],sumValue)
            return True,sumValue,leftValue,rightValue
        
        LRD(root,result)
        return result[0]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值