每日一道面试题-平衡二叉树的判断

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)

}


以上是关于每日一道面试题-平衡二叉树的判断的主要内容,如果未能解决你的问题,请参考以下文章

每日一道编程题(85):平衡二叉树

经典二叉树知识点:平衡二叉树

每日一道面试题-完全二叉树节点个数

笔试面试题目:平衡二叉树的判断

面试题:平衡二叉树

剑指Offer面试题55 - II. 平衡二叉树