平衡二叉树的判断

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/king_qg/article/details/85995168

平衡二叉树的判断

二叉树是比较常见的树,而且树的平衡具有非常重要的特性。如果一颗搜索二叉树的平衡性不是很好,那么搜索的效率就不会很高了。

开门题

前几天考研,今年人大计科的编程题就是判断一棵树是否为平衡二叉树。所以就先拿这个题热热身。

问题

既然要判断一棵树是否为平衡二叉树,那么久需要先理解什么是平衡树。

  • 空树是一颗平衡树
  • 非空树中任意一个节点的左子树和右子树的高度差不大于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。微信公众号:后台技术栈。
image

猜你喜欢

转载自blog.csdn.net/king_qg/article/details/85995168