题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

思路

思路一:

遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。时间复杂度:$O(n^2)$

思路二:

从下往上遍历,如果子树是平衡二叉树,则返回子树高度,否则返回-1。时间复杂度:$O(n)$

代码实现

  1. package Tree;
  2. /**
  3. * 平衡二叉树
  4. * 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
  5. * 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:
  6. * 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
  7. */
  8. public class Solution20 {
  9. public static void main(String[] args) {
  10. Solution20 solution20 = new Solution20();
  11. int[] array = {8, 6, 10, 5, 7, 9, 11};
  12. TreeNode treeNode = solution20.createBinaryTreeByArray(array, 0);
  13. System.out.println(solution20.IsBalanced_Solution_2(treeNode));
  14. }
  15. /**
  16. * 从下往上遍历,如果子树是平衡二叉树,则返回子树高度,否则返回-1
  17. * 时间复杂度:O(n)
  18. *
  19. * @param root
  20. * @return
  21. */
  22. public boolean IsBalanced_Solution_2(TreeNode root) {
  23. return MaxDepth_2(root) != -1;
  24. }
  25. public int MaxDepth_2(TreeNode root) {
  26. if (root == null) {
  27. return 0;
  28. }
  29. int leftHeight = MaxDepth_2(root.left);
  30. if (leftHeight == -1) {
  31. return -1;
  32. }
  33. int rightHeight = MaxDepth_2(root.right);
  34. if (rightHeight == -1) {
  35. return -1;
  36. }
  37. return Math.abs(leftHeight - rightHeight) > 1 ? -1 : 1 + Math.max(leftHeight, rightHeight);
  38. }
  39. /**
  40. * 遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。
  41. * 时间复杂度:O(n^2)
  42. *
  43. * @param root
  44. * @return
  45. */
  46. public boolean IsBalanced_Solution(TreeNode root) {
  47. if (root == null) {
  48. return true;
  49. }
  50. if (Math.abs(MaxDepth(root.left) - MaxDepth(root.right)) > 1)
  51. return false;
  52. return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
  53. }
  54. public int MaxDepth(TreeNode root) {
  55. if (root == null) {
  56. return 0;
  57. }
  58. return 1 + Math.max(MaxDepth(root.left), MaxDepth(root.right));
  59. }
  60. public class TreeNode {
  61. int val = 0;
  62. TreeNode left = null;
  63. TreeNode right = null;
  64. public TreeNode(int val) {
  65. this.val = val;
  66. }
  67. }
  68. public TreeNode createBinaryTreeByArray(int[] array, int index) {
  69. TreeNode tn = null;
  70. if (index < array.length) {
  71. int value = array[index];
  72. tn = new TreeNode(value);
  73. tn.left = createBinaryTreeByArray(array, 2 * index + 1);
  74. tn.right = createBinaryTreeByArray(array, 2 * index + 2);
  75. return tn;
  76. }
  77. return tn;
  78. }
  79. }

剑指Offer-平衡二叉树的更多相关文章

  1. 剑指Offer——平衡二叉树

    题目描述: 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 分析: 平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质 ...

  2. 用java刷剑指offer(平衡二叉树)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 牛客网链接 java代码 import java.lang.Math; public class Solution { public bool ...

  3. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  4. 【Java】 剑指offer(55-2) 平衡二叉树

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...

  5. 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树

    一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...

  6. Go语言实现:【剑指offer】平衡二叉树

    该题目来源于牛客网<剑指offer>专题. 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. ...

  7. 剑指 Offer 55 - II. 平衡二叉树 + 平衡二叉树(AVL)的判断

    剑指 Offer 55 - II. 平衡二叉树 Offer_55_2 题目描述 方法一:使用后序遍历+边遍历边判断 package com.walegarrett.offer; /** * @Auth ...

  8. 力扣 - 剑指 Offer 55 - II. 平衡二叉树

    题目 剑指 Offer 55 - II. 平衡二叉树 思路1(后序遍历+剪枝) 这题是上一题剑指 Offer 55 - I. 二叉树的深度的进阶,逻辑代码和那个一样,也是后续遍历,获取两个子节点较大的 ...

  9. 《剑指offer》平衡二叉树

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  10. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

随机推荐

  1. Python接口测试,Requests模块讲解:GET、POST、Cookies、Session等

    文章最下方有对应课程的视频链接哦^_^ 一.安装.GET,公共方法 二.POST 三.Cookies 四.Session 五.认证 六.超时配置.代理.事件钩子 七.错误异常

  2. 剑指offer 第九天

    35.数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出 ...

  3. java代码调用使用cxf搭建的webService服务传递对象

    前边成功创建好一个cxf的webServcie服务,并带了一个无参数的方法.现在进一步尝试了使用带参数的方法,分别测了用String为参数和用自定义的对象为参数. 其中,使用String为参数时和不带 ...

  4. R语言数据集合并、数据增减、不等长合并

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 数据选取与简单操作: which 返回一个向量 ...

  5. vxWorks内核实现基本原理

    内核实现基本原理     VxWorks 内核维护三个队列:tick队列.ready 队列.active 队列.另外还有一个队列涉及任务,即任务等待资源时所处的队列,这个队列可以是VxWorks内核提 ...

  6. Flex和Servlet结合上传文件报错(一)

    1.具体错误如下 一个表单域 不是一个表单域 java.io.FileNotFoundException: D:\MyEclipse\workspace\FlexFileUpload\Web\null ...

  7. freemarker中的split字符串分割

    freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...

  8. Failed while installing Dynamic Web Module 3.0

    1.错误描述 2.错误原因 Java Web项目不满足Web Module 3.0,需要降低Web Module版本 3.解决办法 (1)降低Web Module版本为2.5 (2)修改jdk版本,升 ...

  9. MiniGUI + Hi3531 笔记 .

    一.移动光驱安装Ubuntu 10.04 1.   重启系统按住Delete进入BIOS界面! 2.   退出/高级模式 --> 启动 --> 启动设备选择. 移动光驱正常被识别后这里应该 ...

  10. C# 文件copy和文件删除

    C# 文件copy和文件删除 public bool CopyFile(string SourcePath, string CopyPathFoder) { bool bfg = false; if ...