本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/balanced-binary-tree
注意:本题目判断的是高度的平衡二叉树,不是平衡二叉树。
思路:从根节点开始,计算每个节点的左右子树的高度,判断每个节点的左右高度差是否大于1;左右子树中只要有一棵子树不是高度平衡的,那么返回false。
代码实现
type TreeNode struct {
Data int
Left *TreeNode
Right *TreeNode
}
func isBalanced(root *TreeNode) bool {
if root == nil {
return true
}
if Abs(deep(root.Left), deep(root.Right)) > 1 {
return false
}
return isBalanced(root.Left) && isBalanced(root.Right)
}
func deep(root *TreeNode) int {
if root == nil {
return 0
}
return 1 + Max(deep(root.Left), deep(root.Right))
}
func Abs(a, b int) int {
if a-b < 0 {
return b - a
}
return a - b
}
func Max(a, b int) int {
if a > b {
return a
}
return b
}
验证
func main() {
// 构造节点{1, 2, 2, 3, 3, nil, nil, 4, 4}
node7 := &TreeNode{Data: 4, Left: nil, Right: nil}
node6 := &TreeNode{Data: 4, Left: nil, Right: nil}
node5 := &TreeNode{Data: 3, Left: nil, Right: nil}
node4 := &TreeNode{Data: 3, Left: node6, Right: node7}
node3 := &TreeNode{Data: 2, Left: nil, Right: nil}
node2 := &TreeNode{Data: 2, Left: node4, Right: node5}
root := &TreeNode{Data: 1, Left: node2, Right: node3}
fmt.Println(isBalanced(root))
// 构造节点{3, 9, 20, nil, nil, 15, 7}
nodeD := &TreeNode{Data: 7, Left: nil, Right: nil}
nodeC := &TreeNode{Data: 15, Left: nil, Right: nil}
nodeB := &TreeNode{Data: 20, Left: nodeC, Right: nodeD}
nodeA := &TreeNode{Data: 9, Left: nil, Right: nil}
root1 := &TreeNode{Data: 3, Left: nodeA, Right: nodeB}
fmt.Println(isBalanced(root1))
}
false
true
Process finished with exit code 0