平衡二叉树的构造_LeetCode 题解 | 110.平衡二叉树

本文介绍了如何使用深度优先搜索(DFS)判断一个二叉树是否为平衡二叉树。作者提供了两种DFS策略:提前阻断法和暴力法。提前阻断法从底至顶计算节点的最大高度,当发现不平衡时立即返回-1;暴力法从顶至底逐层检查每个节点的平衡状态。两种方法的时间复杂度分别为O(N)和O(N^2)。
摘要由CSDN通过智能技术生成

点击上方蓝字设为星标dbffe44e31fc27e64438fc3f88e114ab.png

每周一、三、五上午 8:30 准时推送

下面开始今天的学习~

6e0b4d1163cb73dd87eea07f5ed0ecb9.png

d9d98a88073f71e0c86a7b1ca33193f4.png

力扣题解

自题解功能上线以来

题解区涌现了很多优质题解

如果你有更好的解题思路

不如来题解区大显身手

你可获得

1.力扣官方平台推荐

2.力扣积分

1篇精选题解:200 力扣积分

1篇优质题解:100 力扣积分

(注:题解著作版权归发布者本人所有)

本期精选题解由我们的用户“Krahets”倾情撰写,一起来看看吧!

8d5c920f9d0094d92782d5018ba5be96.png

110.平衡二叉树

题目描述

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

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

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

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

    3   / \  9  20    /  \   15   7

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

       1      / \     2   2    / \   3   3  / \ 4   4

返回 false 。

解决方案

从底至顶(提前阻断法)
  • 对二叉树做深度优先遍历DFS,递归过程中:

  • 终止条件:当DFS越过叶子节点时,返回高度0

  • 返回值:

  • 从底至顶,返回以每个节点root为根节点的子树最大高度(左右子树中最大的高度值加1max(left,right) + 1);

  • 当我们发现有一例 左/右子树高度差 > 1 的情况时,代表此树不是平衡树,返回-1

  • 当发现不是平衡树时,后面的高度计算都没有意义了,因此一路返回-1,避免后续多余计算。

  • 最差情况是对树做一遍完整DFS,时间复杂度为 O(N)

Python
class Solution:    def isBalanced(self, root: TreeNode) -> bool:        return self.depth(root) != -1    def depth(self, root):        if not root: return 0        left = self.depth(root.left)        if left == -1: return -1        right = self.depth(root.right)        if right == -1: return -1        return max(left, right) + 1 if abs(left - right) 2 
Java
class Solution {    public boolean isBalanced(TreeNode root) {        return depth(root) != -1;    }    private int depth(TreeNode root) {        if (root == null) return 0;        int left = depth(root.left);        if(left == -1) return -1;        int right = depth(root.right);        if(right == -1) return -1;        return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;    }}
从顶至底(暴力法)
  • 构造一个获取当前节点最大深度的方法 depth() ,通过比较左右子树最大高度差abs(self.depth(root.left) - self.depth(root.right)),来判断以此节点为根节点下是否是二叉平衡树;

  • 从顶至底 DFS,以每个节点为根节点,递归判断是否是平衡二叉树:

  • 若所有根节点都满足平衡二叉树性质,则返回 True ;

  • 若其中任何一个节点作为根节点时,不满足平衡二叉树性质,则返回False

  • 本方法产生大量重复的节点访问和计算,最差情况下时间复杂度 O(N^2)

Python
class Solution:    def isBalanced(self, root: TreeNode) -> bool:        if not root: return True        return abs(self.depth(root.left) - self.depth(root.right)) <= 1 and \            self.isBalanced(root.left) and self.isBalanced(root.right)    def depth(self, root):        if not root: return 0        return max(self.depth(root.left), self.depth(root.right)) + 1
Java
class Solution {    public boolean isBalanced(TreeNode root) {        if (root == null) return true;        return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);    }    private int depth(TreeNode root) {        if (root == null) return 0;        return Math.max(depth(root.left), depth(root.right)) + 1;    }}

3c4f135854dc64b1dd1eaa115577fd98.png

本文作者:Krahets

编辑&版式:霍霍

声明:本文归作者版权所有,如需转载请联系。

eab8fc07085d1708feb78da9dcac3f63.gif

fc0959367ef2848bdb1579173ac57c0b.png

c90978079b96c151d1fdef547cf4caca.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值