37 lines
700 B
Go
37 lines
700 B
Go
package q222
|
|
|
|
type TreeNode struct {
|
|
Val int
|
|
Left *TreeNode
|
|
Right *TreeNode
|
|
}
|
|
|
|
func count(node *TreeNode, depth int, maxDepth, mdFill *int) bool {
|
|
if node == nil {
|
|
return false
|
|
}
|
|
if node.Left == nil && node.Right == nil { // leaf
|
|
switch {
|
|
case depth == *maxDepth:
|
|
*mdFill++
|
|
case depth > *maxDepth:
|
|
*maxDepth = depth
|
|
*mdFill = 1
|
|
case depth < *maxDepth:
|
|
return true
|
|
}
|
|
}
|
|
return count(node.Left, depth+1, maxDepth, mdFill) ||
|
|
count(node.Right, depth+1, maxDepth, mdFill)
|
|
}
|
|
|
|
func countNodes(root *TreeNode) int {
|
|
maxdepth, mdFill := 0, 0
|
|
count(root, 1, &maxdepth, &mdFill)
|
|
if maxdepth == 0 {
|
|
return 0
|
|
}
|
|
return 1<<(maxdepth-1) - 1 + mdFill
|
|
}
|
|
|
|
var _ = countNodes
|