判断一个二叉树是否是高度平衡二叉树

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点的左右两个子树的高度差的绝对值不超过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


 

发布了193 篇原创文章 · 获赞 154 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/HYZX_9987/article/details/105435460
今日推荐