[解题报告]Maximum Sum BST in Binary Tree

题目链接
寻找和最大的二叉排序树

先预处理
计算以每个节点为根节点的求和值
计算以每个节点为根节点的树是否为二叉排序树
寻找最大即可
Runtime: 212 ms (beats 25.0%)
Memory Usage: 18.4 MB

func maxSumBST(root *TreeNode) (ans int) {
	dump := make(map[*TreeNode]bool)
	summary := make(map[*TreeNode]int)

	var dfsBST func(node *TreeNode, left bool, dad *TreeNode) bool
	dfsBST = func(node *TreeNode, left bool, dad *TreeNode) bool {
		if node == nil {
			return true
		}

		v, f := dump[node]
		if f {
			return v
		}

		if dfsBST(node.Left, true, node) && dfsBST(node.Right, false, node) {
			if dad != nil {
				if left && node.Val >= dad.Val {
					return false
				} else if !left && node.Val <= dad.Val {
					return false
				}
			}
			dump[node] = true
			return true
		}

		dump[node] = false
		return false
	}

	var sum func(node *TreeNode) int
	sum = func(node *TreeNode) int {
		if node == nil {
			return 0
		}

		summary[node] = sum(node.Left) + sum(node.Right) + node.Val

		return summary[node]
	}

	var search func(node *TreeNode)
	search = func(node *TreeNode) {
		if node == nil {
			return
		}

		_, f := dump[node]
		if !f {
			dump[node] = dfsBST(node, true, nil)
		}
		
		search(node.Left)
		search(node.Right)
	}
	search(root)
	sum(root)

	for n, f := range dump {
		if f {
			if summary[n] > ans {
				ans = summary[n]
			}
		}
	}

	return
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值