题目描述(引自剑指offer)
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。
菜鸡与大佬的对话
菜鸡修炼坊
数据结构 | 定义 |
满二叉树 | 任意一层的结点个数都达到最大值的二叉树。 |
完全二叉树 | 在满二叉树的最底层自右至左依次去掉若干个结点。 |
平衡二叉树 | 它是一棵空树或它的左右子树的高度差的绝对值不超过1,并且左右子树都是平衡二叉树。 |
红黑树 | 它是一棵二叉搜索树,并具有以下特点: (1) 每个结点被染成红色或黑色; (2) 根结点是黑色的; (3) 如果一个结点是红色的,那么它的子结点必须是黑色的; (4) 从任何一个结点出发到空结点的路径上,必须包含相同数目的黑结点。 |
题目分析
一番修炼之后,菜鸡向题目发起了进攻。根据平衡二叉树的定义,需要先判断是否为空树,然后判断左右子树的高度差绝对值是否不超过1,然后递归地判断左右子树即可。但菜鸡敏锐地发现,这种思路存在一个结点被重复遍历多次的问题,会影响性能。于是,菜鸡想到了上次修炼的后序遍历,在遍历到一个结点之前先遍历它的左右子树。然后在遍历每个结点的时候记录它的高度,并在遍历过程中判断每一个结点是否是平衡的,这样便可避免重复遍历的问题。菜鸡理顺思路之后,决定用Java代码实现他的心路历程。
代码实现
// 二叉树的定义
public class TreeNode {
int value = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int value) {
this.value = value;
}
}
public class Solution {
public boolean isBalanced(TreeNode root) {
return getTreeDepth(root) != -1;
}
public int getTreeDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = getTreeDepth(root.left);
if (leftDepth == -1) {
return -1;
}
int rightDepth = getTreeDepth(root.right);
if (rightDepth == -1) {
return -1;
}
return Math.abs(leftDepth - rightDepth) > 1 ? -1 : 1 + Math.max(leftDepth, rightDepth);
}
}
经过这次修炼,菜鸡愈发明白,凡是一种数据结构的出现,必定是为了解决某些既定的问题,按照这种思路进行修炼,更能体会到数据结构背后的含义。菜鸡要走的路还很漫长……
相关链接