[LeetCode By Go 93]110. Balanced Binary Tree

题目

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

解题思路

判断一个二叉树是否平衡,需要先清楚平衡二叉树的概念。概念清楚了题目就简单了,先判断根节点的左右子节点的高度差是否不大于1,然后递归判断子节点,如果有高度差大于1的节点,则该树不是平衡二叉树。
平衡二叉树

  1. 可以是空树。
  2. 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1

如定义,假如一棵树的左右子树的高度之差超过1,如左子树的树高为2,右子树的树高为0,子树树高差的绝对值为2就打破了这个平衡。如依次插入1,2,3三个结点(如下图)后,根结点的右子树树高减去左子树树高为2,树就失去了平衡。

image.png

树的深度

  1. 如果一棵树只有一个结点,它的深度为1。
  2. 如果根结点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;同样如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1。
  3. 如果既有右子树又有左子树,那该树的深度就是其左、右子树深度的较大值再加1。

代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func Height(t *TreeNode) (h int)  {
    if nil == t {
        return 0
    }
    left := Height(t.Left)
    right := Height(t.Right)

    if left == 0 && right == 0 {
        return 1
    } 
    
    if left > right {
        return left + 1
    } else {
        return right + 1
    }

}

func isBalanced(root *TreeNode) bool {
    if nil == root {
        return true
    }

    diff := Height(root.Left) - Height(root.Right)
    if diff < -1 || diff > 1 {
        return false
    }

    if isBalanced(root.Left)  && isBalanced(root.Right) {
        return true
    }

    return false
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,327评论 0 25
  • 数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树。算法的性能取决于树的形状,而树的形状取决于...
    sunhaiyu阅读 7,677评论 4 32
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,807评论 0 19
  • 原文链接 B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(...
    非典型程序员阅读 1,183评论 0 3
  • 一. 算法之变,结构为宗 计算机在很多情况下被应用于检索数据,比如航空和铁路运输业的航班信息和列车时刻表的查询,都...
    Leesper阅读 6,992评论 13 42