二叉搜索子树的最大键值和
https://leetcode-cn.com/problems/maximum-sum-bst-in-binary-tree/
后序遍历返回多个值
题目需要我们在每一颗子树上判断:是否是 BST,如果是 BST,计算整颗子树的大小。找出最大的 BST。
递归地说,首先需要一个节点判断自己是不是 BST,则需要:它的左右子树都是 BST,且它的值大于左子树的最大值、小于右子树的最小值。如果它是 BST 了,则需要得知左子树的和、右子树的和,才能计算整棵树的大小。
这道题的奥妙就在于这些信息都是可以用后序遍历得到的,因此只进行 1 次后序遍历,但是返回多个值来记录这些信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| var maxSum int
func maxSumBST(root *TreeNode) int { maxSum = 0 traverse(root) return maxSum }
func traverse(root *TreeNode) [4]int { if root == nil { return [4]int{1, math.MaxInt32, math.MinInt32, 0} }
left, right := traverse(root.Left), traverse(root.Right)
res := [4]int{} if left[0] == 1 && right[0] == 1 && root.Val > left[2] && root.Val < right[1] { res[0] = 1 res[1] = min(left[1], root.Val) res[2] = max(right[2], root.Val) res[3] = left[3] + right[3] + root.Val
maxSum = max(maxSum, res[3]) } else { res[0] = 0 } return res }
func min(a, b int) int { if a < b { return a } return b }
func max(a, b int) int { if a > b { return a } return b }
|