二叉树——110. 平衡二叉树

简介: 本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助

1 题目描述

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

2 题目示例

image.png

image.png

示例 3:

输入:root = []
输出:true

3 题目提示

树中的节点数在范围 [0, 5000] 内
-104 <= Node.val <= 104

4 思路

这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 11,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。

image.png

有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 11,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的过程。

复杂度分析
时间复杂度:o(n²),其中n是二叉树中的节点个数。最坏情况下,二叉树是满二叉树,需要遍历二叉树中的所有节点,时间复杂度是O(n)。
对于节点p,如果它的高度是d,则 height(p)最多会被调用d次(即遍历到它的每一个祖先节点时)。对于平均的情况,一棵树的高度h满足O(h)= O(logn),因为d<h,所以总时间复杂度为O(n logn)。对于最坏的情况,二叉树形成链式结构,高度为O(n),此时总时间复杂度为o(n²)。
空间复杂度:O(n),其中n是二叉树中的节点个数。空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过n。

5 我的答案

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        } else {
            return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
        }
    }

    public int height(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            return Math.max(height(root.left), height(root.right)) + 1;
        }
    }
}
相关文章
|
C语言
【二叉树】的实现
【二叉树】的实现
36 0
|
6月前
|
存储
|
6月前
|
存储 C++
二叉树
二叉树“【5月更文挑战第22天】”
33 3
二叉树(详解)下
二叉树(详解)
60 0
|
6月前
|
算法 网络协议 NoSQL
认识二叉树(详细介绍)
认识二叉树(详细介绍)
|
6月前
|
C++
平衡二叉树(C++)
平衡二叉树(C++)
35 1
|
6月前
|
存储 数据库管理
【二叉树】
【二叉树】
51 0
|
6月前
|
存储
二叉树的实现(下)
二叉树的实现(下)
61 0
|
存储 算法 关系型数据库
有了二叉树,平衡二叉树为什么还需要红黑树
有了二叉树,平衡二叉树为什么还需要红黑树
101 0
有了二叉树,平衡二叉树为什么还需要红黑树