问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4074 访问。

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

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

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

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

3

      / \

    9  20

   /       \

 15        7

返回 true 。

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

1

      / \

     2   2

    / \

   3   3

  / \

 4   4

返回 false 。


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.

Given the following tree [3,9,20,null,null,15,7]:

3

      / \

    9  20

   /       \

15        7

Return true.

Given the following tree [1,2,2,3,3,null,null,4,4]:

1

      / \

     2   2

    / \

   3   3

  / \

 4   4

Return false.


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4074 访问。

public class Program {

    public static void Main(string[] args) {
var root = new TreeNode(1) {
left = new TreeNode(2),
right = new TreeNode(3)
}; var res = IsBalanced(root);
Console.WriteLine(res); root = new TreeNode(1) {
left = new TreeNode(2) {
left = new TreeNode(3) {
left = new TreeNode(4)
}
},
right = new TreeNode(5) {
right = new TreeNode(6)
}
}; res = IsBalanced2(root);
Console.WriteLine(res); Console.ReadKey();
} public static bool IsBalanced(TreeNode root) {
//传统递归法,简单易写
//空树是平衡二叉树,因为左右子树数量都是 0
if(root == null) return true;
//左右子树高度差大于 1,不是平衡二叉树
if(Math.Abs(MaxDepth(root.left) - MaxDepth(root.right)) > 1) return false;
//判定左右子树是否为平衡二叉树
return IsBalanced(root.left) && IsBalanced(root.right);
} public static int MaxDepth(TreeNode root) {
//计算树每个子树的高度
if(root == null) return 0;
var left = MaxDepth(root.left);
var right = MaxDepth(root.right);
return Math.Max(left, right) + 1;
} public static bool IsBalanced2(TreeNode root) {
//优化递归法
//此段代码引用自 LeetCode 的提交代码
//由本人添加注释
return MaxDepth2(root) >= 0;
} public static int MaxDepth2(TreeNode root) {
//如果是空树,判定为平衡的
if(root == null) return 0;
//计算左右子树的高度
var left = MaxDepth2(root.left);
var right = MaxDepth2(root.right);
//如果左子树、右子树或高度差大于 1,则返回 -1
//-1 表示判定为非平衡树,立即返回
//导致调用堆栈在回溯时发现上一次是 -1
//由于代码 left < 0 || right < 0 的存在,会使 -1 逐步上传
//又被回溯到上上一次,一直到无法回溯时为止
//按照原代码作者的部分注释,即不平衡的树会被传染到最上层
//也即当发现一个 -1 时,该代码以非常高的效率判定原树为非平衡的
//因为当前树为平衡的,不能判定原树是不是平衡的
//但当前树为非平衡的,原树肯定是不平衡的
//感谢原作者的代码为我们分享如此巧妙的优化
if(left < 0 || right < 0 || Math.Abs(left - right) > 1) return -1;
return Math.Max(left, right) + 1;
} public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) { val = x; }
} }

以上给出2种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4074 访问。

True
False

分析:

显而易见,以上2种算法的时间复杂度均为:  。

C#LeetCode刷题之#110-平衡二叉树(Balanced Binary Tree)的更多相关文章

  1. LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15

    110. 平衡二叉树 110. Balanced Binary Tree 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树 ...

  2. [LeetCode 110] - 平衡二叉树 (Balanced Binary Tree)

    问题 给出一棵二叉树,判断它是否在高度上是平衡的. 对于本问题,高度上平衡的二叉树定义为:每个节点的两棵子树的深度差永远不大于1的一棵二叉树. 初始思路 根据定义,思路应该比较直接:递归计算每个节点左 ...

  3. leetcode 刷题之路 64 Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...

  4. 平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称AVL树

    平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称AVL树 (a)和(b)都是排序二叉树,但是查找(b)的93节点就需要查找6次,查找(a)的93 ...

  5. 平衡二叉树Balanced Binary Tree

    [抄题]: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced b ...

  6. [Swift]LeetCode110. 平衡二叉树 | Balanced Binary Tree

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

  7. LeetCode算法题-Average of Levels in Binary Tree(Java实现)

    这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...

  8. leetcode刷题-559. Maximum Depth of N-ary Tree

    题目: https://leetcode.com/problems/maximum-depth-of-n-ary-tree/description/ n-ary-tree的数据结果表示 // Defi ...

  9. [leetcode刷题笔记]Implement Trie (Prefix Tree)

    题目链接 一A,开森- ac代码: class TrieNode { // Initialize your data structure here. char content; boolean isW ...

  10. LeetCode(110) Balanced Binary Tree

    题目 Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bina ...

随机推荐

  1. CentOS 无法加载 ntfs文件系统类型解决办法

    问题: CentOS无法加载ntfs 文件系统类型的移动硬盘. 解决办法: 1.下载rpmforge,下载对应的版本.(对应的CentOS版本,并区分32位和64位). 例如: wget http:/ ...

  2. Redis 6.0 新特性 ACL 介绍

    Redis 6.0 新特性 ACL 介绍 Intro 在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是没有用户的概念的,其实 ...

  3. [开源硬件DIY] 自制一款精致炫酷的蓝牙土壤温湿度传感器,用于做盆栽呵护类产品(API开放,开发者可自行DIY微信小程序\安卓IOS应用)

    目录 前言: 1. 成品展示 2. 原理图解析 3. pcb设计 4. 嵌入式对外提供接口 4.1 蓝牙广播 4.2 蓝牙服务和属性 4.3 数据包格式 4.4 数据通信模型 重要 . 前言: 本期给 ...

  4. liunx安装和部署nacos配置中心

    1.下载https://github.com/alibaba/nacos/releases  nacos-server-1.3.1.tar.gz  源码包2.上传到liunx服务器   /usr/lo ...

  5. http安全

    https介绍  因为HTTP是明文传输,所以不安全,容易被黑客窃听或窜改: 通信安全必须同时具备机密性.完整性,身份认证和不可否认这四个特性 HTTPS的语法.语义仍然是HTTP,但把下层的协议由T ...

  6. IntelliJ IDEA 2019.3.4永久破解(持续更新)--已更新

    第一步,下载最新破解包: 链接: https://pan.baidu.com/s/1djUF9TiNZC4rIfxczxfIew 提取码: f521 把破解包两个文件放进bin目录下,这一步极为重要! ...

  7. Java进阶专题(十一) 想理解JVM看了这篇文章,就知道了!(中)

    前言 ​ 上次讲解了JVM内存相关知识,今天继续JVM专题. JVM垃圾回收算法 什么是垃圾回收 ​ 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导致内存溢 ...

  8. PHP checkdate() 函数

    ------------恢复内容开始------------ 实例 检查一些日期是否是有效的格利高里日期: <?phpvar_dump(checkdate(12,31,-400));echo & ...

  9. PHP fgetss() 函数

    定义和用法 fgetss() 函数从打开的文件中返回一行,并过滤掉 HTML 和 PHP 标签. fgetss() 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止返回一个新行. ...

  10. PHP ftp_ssl_connect() 函数

    定义和用法 ftp_ssl_connect() 函数打开一个安全的 SSL-FTP 连接. 当连接打开,您就可以在服务器运行 FTP 函数. 语法 ftp_ssl_connect(host,port, ...