每日一道面试题-平衡二叉树的判断
Posted 后台技术栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一道面试题-平衡二叉树的判断相关的知识,希望对你有一定的参考价值。
平衡二叉树的判断
二叉树是比较常见的树,而且树的平衡具有非常重要的特性。如果一颗搜索二叉树的平衡性不是很好,那么搜索的效率就不会很高了。
开门题
前几天考研,今年人大计科的编程题就是判断一棵树是否为平衡二叉树。所以就先拿这个题热热身。
问题
既然要判断一棵树是否为平衡二叉树,那么久需要先理解什么是平衡树。
空树是一颗平衡树
非空树中任意一个节点的左子树和右子树的高度差不大于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)
}
以上是关于每日一道面试题-平衡二叉树的判断的主要内容,如果未能解决你的问题,请参考以下文章