算法—leetcode—110

248 阅读2分钟

题目

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…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。