转载本文章请标明作者 ​​​《Darwin的程序空间》​


剑指offer | 面试题55 - II. 平衡二叉树_平衡二叉树

开始行动,你已经成功一半了,献给正在奋斗的我们


题目

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树;

给定如图的二叉树,返回true;

剑指offer | 面试题55 - II. 平衡二叉树_平衡二叉树_02

解题分析

什么是平衡二叉树,在题干中就给出了解释;所谓平衡二叉树就是,二叉树中任意节点的左右子树的深度相差不超过1;

我们可以从上向下递归这棵二叉树每一个节点的左右子树,如果递归到空节点,那么就返回0(因为这层是无效的,不记录到左右子树的高度),然后然后到叶子节点的,因为叶子节点的左右节点都是0,所以它是一个平衡二叉子树,然后我们在把这颗子树左右节点的最高度加一当做这个节点为根节点的树的高度返回给这个节点的父节点,父节点通过这样获得各个子树的高度,如果的高度差超过了1,那么直接返回-1并终止循环,如果一直没有终止循环,我们就得到结论,这是一棵平衡二叉树;

代码(JAVA实现)

ps:这里笔者使用的jdk为1.8版本

class Solution {
public boolean isBalanced(TreeNode root) {
return backtracking(root) != -1;
}

public int backtracking(TreeNode root) {
if (Objects.isNull(root)) {
return 0;
}
int left = backtracking(root.left);
// 左递归发现了高度差超过1,终止循环
if (left == -1) {
return -1;
}
int right = backtracking(root.right);
// 右递归发现了高度差超过1,终止循环
if (right == -1) {
return -1;
}
return Math.abs(right - left) < 2 ? Math.max(right , left) + 1 : -1;
}
}

剑指offer | 面试题55 - II. 平衡二叉树_平衡二叉树_03


剑指offer | 面试题55 - II. 平衡二叉树_二叉树_04