平衡二叉树的判断
二叉树是比较常见的树,而且树的平衡具有非常重要的特性。如果一颗搜索二叉树的平衡性不是很好,那么搜索的效率就不会很高了。
开门题
前几天考研,今年人大计科的编程题就是判断一棵树是否为平衡二叉树。所以就先拿这个题热热身。
问题
既然要判断一棵树是否为平衡二叉树,那么久需要先理解什么是平衡树。
- 空树是一颗平衡树
- 非空树中任意一个节点的左子树和右子树的高度差不大于1
思路
直接根据定义入手, 最简单的实现就是使用递归。既然需要统计树的高度,那么会有一个函数统计树的高度。
实现
树的结构定义如下:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
树的高度
递归公式如下:
- 空树:返回0
- 非空树:max(左子树高度,右子树高度)+1
func height(root *TreeNode) int {
if root == nil {
return 0
}
lh := height(root.Left)
rh := height(root.Right)
largest := lh
if rh > lh {
largest = rh
}
largest++
return largest
}
平衡性的判断
递归公式:
- 空树:返回true
- 非空树
- 以当前节点为根节点的树不平衡:返回false
- 以当前节点为根节点的树平衡:递归的判断左子树和右子树是否平衡
func isBalanced(root *TreeNode) bool {
if root == nil {
return true
}
lh := height(root.Left)
rh := height(root.Right)
diff := lh - rh
if diff < -1 || diff > 1 {
return false
}
return isBalanced(root.Left) && isBalanced(root.Right)
}
关于作者
大四学生一枚,分析数据结构,面试题,golang,C语言等知识。QQ交流群:521625004。微信公众号:后台技术栈。