题目:平衡二叉树 simple
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
package leetCode.DFS;
public class lc_dfs_110_isBalanced {
/*
题目:平衡二叉树 simple
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。
*/
/*
思路:
本题和剑指offer39题是一样的,直接复制其思想
普通的求两子树高度差,简单易懂,但在判断上层子树的时,会多次重复遍历下层结点,增加了不必要的开销。
如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;
如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。-->方法1
*/
public static void main(String[] args) {
lc_dfs_110_isBalanced m = new lc_dfs_110_isBalanced();
TreeNode node = new TreeNode(3);
TreeNode node1 = new TreeNode(9);
TreeNode node2 = new TreeNode(20);
TreeNode node3 = new TreeNode(15);
TreeNode node4 = new TreeNode(7);
node.left = node1;
node.right = node2;
node2.left = node3;
node2.right = node4;
System.out.println(m.depth(node));
}
public boolean isBalanced(TreeNode root) {
int dep = depth(root);
return dep != -1;//!=-1就是平衡二叉树
}
public int depth(TreeNode node) {
if (node == null)
return 0;
int ldep = depth(node.left);
//一旦发现左子树中存在高度差>1的子树,直接返回-1,不再计算深度,
if (ldep == -1)
return -1;
int rdep = depth(node.right);
if (rdep == -1)
return -1;
//从下往上,如果深度大于1,直接返回-1,否则返回树的深度
return Math.abs(ldep - rdep) > 1 ? -1 : Math.max(ldep, rdep) + 1;
}
//简单易懂,但在判断上层子树的时,会多次重复遍历下层结点,增加了不必要的开销。
// 如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;
// 如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。-->方法1
public boolean isBalanced2(TreeNode root) {
if (root == null)
return true;
if (Math.abs(depth(root.left) - depth(root.right)) > 1)
return false;
//平衡二叉树(又称为AVL 树):注意左右子树也必须满足
// 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。
return isBalanced2(root.left) && isBalanced2(root.right);
}
//普通的求树的高度
public int depth2(TreeNode node) {
if (node == null)
return 0;
return Math.max(depth2(node.left), depth2(node.right)) + 1;
}
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}