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]
发布了100 篇原创文章 · 获赞 1 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u011255131/article/details/104736747