题目
110.平衡二叉树
题目描述
给定一个二叉树,判断它是否是高度平衡的二叉树。
平衡二叉树
一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。
思路
递归的顺序可以是自顶向下或者自底向上
自顶向下递归
前序遍历方式
1.判断节点是否为nil,如果是nil则是平衡二叉树
2.判断左右子数的高度差是否大于一,如果大于一,则不是平衡二叉树,否则继续校验子树
3.判断左子数是否为平衡二叉树
4.判断右子数是否平衡二叉树
自底向上
后续遍历
1.求左,右子树高度
2.左子数,右子数高度是否为-1, 左右高度差大于1,则返回-1
3.当前树的高度是否大于等于0
示例
data := &TreeNode{
Val:3,
Left:&TreeNode{
Val:9,
},
Right:&TreeNode{
Val:20,
Left:&TreeNode{Val:15},
Right:&TreeNode{Val:7},
},
}
data := &TreeNode{
Val:1,
Left:&TreeNode{
Val:2,
Left:&TreeNode{
Val:3,
Left:&TreeNode{Val:4},
Right:&TreeNode{Val:4},
},
Right:&TreeNode{Val:3},
},
Right:&TreeNode{
Val:2,
},
}
代码
package leetcode
import(
"log"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// isBalanced
// 平衡二叉树
// 前序遍历方式
func isBalanced(root *TreeNode) bool {
// 如果节点为nil 则为平衡二叉树
if root == nil {
return true
}
// 左右子数的高度差
log.Println(root.Val)
log.Println("左子数的高度", maxDepth(root.Left))
log.Println("右子数的高度", maxDepth(root.Right))
if abs(maxDepth(root.Left)-maxDepth(root.Right)) > 1 {
return false
}
if !isBalanced(root.Left){
return false
}
return isBalanced(root.Right)
}
// maxDepth
// 二叉树高度
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
return max(maxDepth(root.Left), maxDepth(root.Right)) + 1
}
// abs
// 求一个数的绝对值
func abs(num int) int {
if num > 0 {
return num
}
return -num
}
// max
// 取两个数的最大值
func max(left, right int) int {
if left > right {
return left
}
return right
}
// isBalancedV2
// 平衡二叉树
// 后续遍历
func isBalancedV2(root *TreeNode) bool {
return height(root) >= 0
}
// height
func height(root *TreeNode) int {
if root == nil {
return 0
}
// 左右子数高度
leftHeight := height(root.Left)
rightHeight := height(root.Right)
log.Println(root.Val, leftHeight, rightHeight)
// 校验左节点和右节点高度是否为-1
// 校验左右节点高度差是否大于1
if leftHeight == -1 || rightHeight == -1 || abs(leftHeight - rightHeight) > 1 {
return -1
}
// 求当前节点的高度
return max(leftHeight, rightHeight) + 1
}
参考
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/ba…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。