解题思路:因为平衡二叉树任何一个子树左右两个孩子节点差也都不能>1,可以看出题目要用递归。递归调用每个节点,每个节点都要计算层数因此时间复杂度O(N^2),空间复杂度O(N)。
import java.util.*;
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if(root ==null){
return true;
}
if(Math.abs(getTreeNodeHight(root.left) - getTreeNodeHight(root.right)) >1){
return false;
}
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
}
//获取层数的方法
private int getTreeNodeHight(TreeNode root){
if(root == null){
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int hight = 0;
while(!queue.isEmpty()){
int size = queue.size();
for(int i =0;i<size;i++){
TreeNode node = queue.poll();
if(node.left != null){
queue.offer(node.left);
}
if(node.right!= null){
queue.offer(node.right);
}
}
hight++;
}
return hight;
}
}
获取层数的方法也可以递归,这里作下优化
import java.util.*;
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) {
return true;
}
if (Math.abs(getTreeNodeHight(root.left) - getTreeNodeHight(root.right)) > 1) {
return false;
}
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
}
//获取层数的方法,也可以递归
private int getTreeNodeHight(TreeNode root) {
if (root == null) {
return 0;
}
return Math.max(getTreeNodeHight(root.left), getTreeNodeHight(root.right)) + 1;
}
}
解法二:回溯,左孩子满足最大差值<=1,右孩子满足最大差值<=1,返回左右孩子各自的高度给父节点,依次倒推,只要不满足就返回-1,最后就会返回false。时间复杂度O(N),空间复杂度O(N)。
import java.util.*;
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) {
return true;
}
if (getTreeNodeHight(root) == -1) {
return false;
}
return true;
}
//获取层数的方法
private int getTreeNodeHight(TreeNode root) {
if (root == null) {
return 0;
}
int left = getTreeNodeHight(root.left);
if (left == -1) {
return -1;
}
int right = getTreeNodeHight(root.right);
if (right == -1) {
return -1;
}
if (Math.abs(right - left) > 1) {
return -1;
}
return Math.max(getTreeNodeHight(root.left), getTreeNodeHight(root.right)) + 1;
}
}