1. DFS
如果一个节点的左右子节点都是平衡的,并且左右子节点的深度差不超过 1,则可以确定这个节点就是一颗平衡二叉树。
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) return true;
//判断左子树和右子树是否符合规则,且深度不能超过2
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right) && Math.abs(deep(root.left) - deep(root.right)) < 2;
}
//判断二叉树深度
public int deep(TreeNode root) {
if (root == null) return 0;
return Math.max(deep(root.left), deep(root.right)) + 1;
}
}
2. 回溯
对于父节点,需要确定两个子节点深度之差小于一。对于作为子节点的立场,需要向自己的上一级节点传递的自己深度。
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if(deep(root)==-1) return false;
return true;
}
public int deep(TreeNode node){
if(node == null) return 0;
int left = deep(node.left);
if(left == -1 ) return -1;
int right = deep(node.right);
if(right == -1 ) return -1;
//两个子节点深度之差小于一
if((left-right) > 1 || (right-left) > 1){
return -1;
}
//父节点需要向自己的父节点报告自己的深度
return (left > right ? left:right) + 1;
}
}