剑指offer_二叉树---平衡二叉树

简介: 剑指offer_二叉树---平衡二叉树

##题目描述

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

##思路

如果每个节点的左右子树的深度相差都不超过1,即最大深度差为1,则可判定为平衡二叉树。

两种思路:

第一种是递归判断每一个根节点,都要求出它的左右子树的深度,深度相差小于1即可(根左右),可以理解为自顶向下。

第二种是从自己的左右子树开始判断用一个数组来记录深度(为防止归零,所以用引用类型)只要自己的左右深度条件都满足,则该树满足,不需要重复计算深度。(左右根),可以理解为自底向上

##代码

第一种思路

/**
 * 
 */
package offerTest;
/**
 * <p>
 * Title:Balance
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月21日 上午9:45:44
 */
public class Balance {
  public boolean IsBalanced(TreeNode root) {
    if (root == null) { // 递归结束条件
      return true;
    }
    int diff = Math.abs(deep(root.left) - deep(root.right)); // 求绝对值函数
    if (diff > 1) {
      return false; // 如果相差大于1,返回false
    }
    return IsBalanced(root.left) && IsBalanced(root.right); // 递归检查每一个几点
  }
  // 求节点深度函数
  public int deep(TreeNode root) {
    if (root == null) {
      return 0;
    }
    return deep(root.left) > deep(root.right) ? deep(root.left) + 1
        : deep(root.right) + 1;
  }
}

第二种思路:优化算法

/**
 * 
 */
package offerTest;
import 二叉树.TreeNode;
/**
 * <p>
 * Title:Balance
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月21日 上午9:45:44
 */
public class Balance {
   // 优化算法
  public boolean IsBalancedSuper(TreeNode root) {
    int[] depth = new int[1];
    return isBalance(root, depth);
  }
  public boolean isBalance(TreeNode root, int[] depth) {
    if (root == null) {
      depth[0] = 0;
      return true;
    }
    boolean leftbalance = isBalance(root.left, depth);
    int leftdepth = depth[0];
    boolean rightbalance = isBalance(root.right, depth);
    int rightdepth = depth[0];
    depth[0] = Math.max(leftdepth + 1, rightdepth + 1); // 取二者最大为深度
    return leftbalance && rightbalance
        && Math.abs(rightdepth - leftdepth) < 1; // 如果左右子树都平衡,且相差小于1,则为平衡二叉树
  }
}


相关文章
|
7天前
【力扣刷题】二叉树的中序遍历、二叉树的最大深度、翻转二叉树、对称二叉树
【力扣刷题】二叉树的中序遍历、二叉树的最大深度、翻转二叉树、对称二叉树
15 0
|
19天前
|
Java BI 数据库管理
二叉树---前,中,后序遍历做题技巧(前,中,后,层次,线索二叉树)
二叉树---前,中,后序遍历做题技巧(前,中,后,层次,线索二叉树)
39 11
|
19天前
|
算法 API DataX
二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”
二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”
|
19天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
19天前
|
存储 Serverless 索引
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
|
10月前
|
算法 C语言 C++
【树】你真的会二叉树了嘛? --二叉树LeetCode专题
先来一题简单的题目练练手,之前有提到过,二叉树的前序遍历就是通过根左右的遍历方式来进行的,所以这题总体思路也是一样.不过要说明的是,这里采用了c语言,所以输出时需要自己创建一个动态数组,每次将访问到的val存入动态数组当中即可.
35 0
|
19天前
二叉树OJ题:LeetCode--104.二叉树的最大深度
二叉树OJ题:LeetCode--104.二叉树的最大深度
21 0
|
19天前
二叉树OJ题:LeetCode--100.相同的树
二叉树OJ题:LeetCode--100.相同的树
35 0
|
19天前
二叉树OJ题:LeetCode--144.二叉树的前序遍历
二叉树OJ题:LeetCode--144.二叉树的前序遍历
31 0
|
10月前
|
算法 C语言 C++
【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅳ
本章依然是二叉树的刷题 忘记的朋友们可以去看看我的二叉树专题
36 0