题目概述
- 算法说明
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
注:我们约定空树是平衡二叉树。 - 测试用例
输入: {1,2,3,4,5,6,7}
返回值: true
解析&参考答案
- 解析
方法1:使用递归法,先计算左右子树的深度,然后再判断左右子树是否为平衡二叉树。 - 参考答案
vim jz39.go
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func TreeDepth(pRoot *TreeNode) int {
if pRoot == nil {
return 0
}
if TreeDepth(pRoot.Left) >= TreeDepth(pRoot.Right) {
return 1 + TreeDepth(pRoot.Left)
} else {
return 1 + TreeDepth(pRoot.Right)
}
}
func IsBalancedSolution(pRoot *TreeNode) bool {
if pRoot == nil {
return true
}
depthL, depthR := TreeDepth(pRoot.Left), TreeDepth(pRoot.Right)
if depthL-depthR <= 1 && depthL-depthR >= -1 {
return IsBalancedSolution(pRoot.Left) && IsBalancedSolution(pRoot.Right)
} else {
return false
}
}
func main() {
root := &TreeNode{1,
&TreeNode{2, &TreeNode{4, nil, nil}, &TreeNode{5, nil, nil}},
&TreeNode{3, &TreeNode{6, nil, nil}, &TreeNode{7, nil, nil}}}
result := IsBalancedSolution(root)
fmt.Println(result)
}
注意事项
- to add
说明
- 当前使用 go1.15.8
- 参考 牛客网--剑指offer
标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
注意!!!
- 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
- 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
- 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解