一.深度优先遍历(dfs)
public boolean IsBalanced_Solution (TreeNode pRoot) {
// write code here
//如果为空树,就返回true
if(pRoot == null) {
return true;
}
//只有一个根结点,高度差不大于1,返回teue
if (pRoot.left == null && pRoot.right == null) {
return true;
}
/**
* 先递归左树,计算左树的高度差,如果大于1了,就返回false
* 再递归右树,计算右树的高度差,如果大于1了,就返回false
*/
return IsBalanced_Solution(pRoot.left)
&& IsBalanced_Solution(pRoot.right)
&& Math.abs(deep(pRoot.left) - deep(pRoot.right)) < 2;
}
private int deep(TreeNode root) {
if (root == null) {
return 0;
}
/**
* 先传进来左树,计算最大深度
* 再计算右树的最大深度
*/
return Math.max(deep(root.left),deep(root.right)) + 1;
}
二.回溯法
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
public boolean IsBalanced_Solution (TreeNode pRoot) {
// write code here
if (pRoot == null) {
return true;
}
if (pRoot.left == null && pRoot.right == null) {
return true;
}
if (deep(pRoot) == -1) return false;
return true;
}
private int deep(TreeNode root) {
//向下递归为空就返回0
if (root == null) {
return 0;
}
int left = deep(root.left);
if (left == -1) return -1;
int right = deep(root.right);
if (right == -1) return -1;
//左子树跟右子树的高度差不能大于1
if ((left - right) > 1 || (right - left) > 1) {
return -1;
}
/**
* 得到左子树的最大深度和右子树的最大深度,
* 然后再加根结点的深度为1
*/
return (left > right ? left : right) + 1;
}
}