Узел
type TreeNode struct {
Val int
Left, Right *TreeNode
}
Базовый случай рекурсии — node == nil.
Рекурсивная функция обычно возвращает информацию о поддереве родителю.
Минимальный синтаксис, который понадобится в решении.
type TreeNode struct {
Val int
Left, Right *TreeNode
}
Базовый случай рекурсии — node == nil.
var dfs func(*TreeNode) int
dfs = func(node *TreeNode) int { /* ... */ }
Замыкание удобно, если нужен внешний ответ.
Три идиоматичных решения на Go с оценкой времени и памяти.
Глубина = 1 + максимум глубин детей.
O(n) time · O(height) spacefunc maxDepth(root *TreeNode) int {
if root == nil { return 0 }
return 1 + max(maxDepth(root.Left), maxDepth(root.Right))
}
Родителю отдаём только одну лучшую ветвь.
O(n) time · O(height) spacefunc maxPathSum(root *TreeNode) int {
best := math.MinInt
var gain func(*TreeNode) int
gain = func(node *TreeNode) int {
if node == nil { return 0 }
left, right := max(0, gain(node.Left)), max(0, gain(node.Right))
best = max(best, node.Val+left+right)
return node.Val + max(left, right)
}
gain(root)
return best
}
Меняем детей местами и рекурсивно обрабатываем оба поддерева.
O(n) time · O(height) spacefunc invertTree(root *TreeNode) *TreeNode {
if root == nil { return nil }
root.Left, root.Right = invertTree(root.Right), invertTree(root.Left)
return root
}