本题来自左神《程序员代码面试指南》“判断二叉树是否为平衡二叉树”题目。

题目

平衡二叉树的性质为:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过 1。

给定一棵二叉树的头节点 head,判断这棵二叉树是否为平衡二叉树。

要求:如果二叉树的节点数为 N,则要求时间复杂度为 O(N)


题解

平衡二叉树的标准是:对任何子树来说,左子树和右子树的高度差都不超过1。本题解法的整体过程为 树形 dp 套路,请读者先阅读 “找到二叉树中的最大搜索二叉子树” 问题了解这个套路,本题是这个套路的再次展示。

首先,树形dp 套路的前提是满足的。依次考查每个节点为头节点的子树,如果都是平衡二叉树,那么整体就是平衡二叉树。

树形 dp 套路第一步

以某个节点X 为头节点的子树中,分析答案有哪些可能性,并且这种分析是以X 的左子树、X 的右子树和X 整棵树的角度来考虑可能性的。

  • 可能性一:如果 X 的左子树不是平衡的,则以 X 为头节点的树就是不平衡的。
  • 可能性二:如果 X 的右子树不是平衡的,则以 X 为头节点的树就是不平衡的。
  • 可能性三:如果 X 的左子树和右子树高度差超过 1,则以 X 为头节点的树就是不平衡的。
  • 可能性四:如果上面可能性都没中,那么以 X 为头节点的树是平衡的。
树形 dp 套路第二步

根据第一步的可能性分析,列出所有需要的信息。左子树和右子树都需要知道各自是否平衡,以及高度这两个信息。

树形 dp 套路第三步

根据第二步信息汇总。定义信息如 ReturnType 类所示。

树形 dp 套路第四步

设计递归函数。递归函数是处理以X 为头节点的情况下的答案,包括设计递归的 base case,默认直接得到左树和右树所有的信息,以及把可能性做整合,并且也返回第三步的信息结构这四个小步骤。本题的递归实现请看以下的 process 方法,主函数是以下的 isBalanced 方法。


代码

含测试用例

package chapter_3_binarytreeproblem;public class Problem_13_IsBalancedTree {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}public static boolean isBalanced(Node head) {return process(head).isBalanced;}public static class ReturnType {public boolean isBalanced;public int height;public ReturnType(boolean isBalanced, int height) {this.isBalanced = isBalanced;this.height = height;}}public static ReturnType process(Node head) {if (head == null) {return new ReturnType(true, 0);}ReturnType leftData = process(head.left);ReturnType rightData = process(head.right);int height = Math.max(leftData.height, rightData.height) + 1;boolean isBalanced = leftData.isBalanced && rightData.isBalanced && Math.abs(leftData.height - rightData.height) < 2;return new ReturnType(isBalanced, height);}public static void main(String[] args) {Node head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.left.right = new Node(5);head.right.left = new Node(6);head.right.right = new Node(7);System.out.println(isBalanced(head));}}

左神算法:判断二叉树是否为平衡二叉树(树形dp套路,Java版)相关推荐

  1. 左神算法:环形单链表的约瑟夫问题(Java版)

    本题来自左神<程序员面试代码指南>"环形单链表的约瑟夫问题"题目. 题目 据说,著名犹太历史学家 Josephus 有过以下故事: 在罗马人占领乔塔帕特后,39 个犹太 ...

  2. 左神算法:二叉树的按层打印与ZigZag打印(Java版)

    本题来自左神<程序员代码面试指南>"二叉树的按层打印与ZigZag打印"题目. 题目 给定一棵二叉树的头节点 head,分别实现 按层 和 ZigZag 打印 二叉树的 ...

  3. 左神算法4.二叉树及相关习题理解

    题目1:实现二叉树的先序.中序.后序遍历[递归方式和非递归方式] 1.1递归实现 public class BinaryTreeWithRecur {public static class Node{ ...

  4. 左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)

    二叉树的最小深度 题目 https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/ 二叉树定义如下: // Definition fo ...

  5. 判断二叉树是否为平衡二叉树

    题目:判断二叉树是否为平衡二叉树 思路:迭代,需要借助二叉树的高度,判断一个树是否为平衡二叉树,则判断其左子树和右子树是否为平衡二叉树 public static boolean isAVLRec(T ...

  6. python判断二叉树是否为平衡二叉树

    python判断二叉树是否为平衡二叉树 树是数据结构中的重中之重,尤其以各类二叉树为学习的难点.一直以来,对于树的掌握都是模棱两可的状态,现在希望通过写一个关于二叉树的专题系列.在学习与总结的同时更加 ...

  7. 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)

    本题来自左神<程序员面试代码指南>"最大值减去最小值小于或等于num的子数组的数量"题目. 题目 给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: ...

  8. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  9. 判断二叉树是否是平衡二叉树

    平衡二叉树(Balanced Binary Tree)又被称为AVL树:且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树. 主要实现思路: ...

最新文章

  1. select case语句举例_图解Go select语句原理
  2. javascript面向对象学习笔记(一)——继承
  3. 面试:如何从 100 亿 URL 中找出相同的 URL?
  4. Shell - 文件运算符
  5. 云服务器(uCloud)部署java web项目(二) 安装,配置apache服务器
  6. Windows上安装Mac OS虚拟机
  7. oracle11g中的join,sql - 使用Oracle 11g中的+符号进行左外连接
  8. PHP中的语法特点小结
  9. 阿里毕玄:推荐给Java程序员的7本好书
  10. c语言 数据结构 list、queue、tree抽象数据类型的定义与实现 详尽代码和注释
  11. 【珍藏版】 200个机器学习 NLP Python 免费相关教程
  12. 程序员修炼之道:从小工到专家
  13. 【VS开发】Windows平台下Makefile学习笔记
  14. C++的C4305和C4800的编译警告
  15. Atitit 信息处理设备与历史与趋势 目录 1. It设备简史与艾提拉觉得常见重要的设备 2 2. 第一部分 IT萌芽期(约公元前4000年至1945年) 2 2.1. 苏美尔人的象形文字(约公元
  16. 基于 Octotree 的[码云]文件树插件
  17. Foxpro 简体转繁体的一种方式(代码)
  18. 启用了被称为 HTTP 严格传输安全(HSTS)的安全策略,Firefox 只能与其建立安全连接
  19. 设定窗体显示状态(ShowWindow)
  20. html如何设定盒子的高,css 高度height设置

热门文章

  1. UVA - 1533Moving Pegs移动小球 (bfs加状态压缩)
  2. HDU4267(2012长春网络赛)
  3. 用C++实现的壳(基础版)
  4. 漫游Kafka实战篇之客户端编程实例
  5. 2_3 ProxyMode.cpp 代理模式
  6. 千万不要在深夜提交代码
  7. 如果我是面试官,我会问你 Spring 那些问题?
  8. 为什么QueueingConsumer会被Deprecated?
  9. 真实世界的 TCP HOL blocking
  10. 基于LZ77算法的文件压缩收尾