平衡二叉树和完全二叉树的判断
平衡二叉树
概念:可以是空树。 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1。
判断代码
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) return true;
return
Math.abs(height(root.left)-height(root.right)) <= 1 //保证高度之差不超过1
&& IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);//保证左右子树都是平衡二叉树
}
public int height(TreeNode root) {
if (root == null) return 0;
return Math.max(height(root.left),height(root.right)) + 1;
}
完全二叉树
概念:从根往下数,除了最下层以外所有的节点都是全满(都有两个子节点),并且最下层所有叶结点都向左边靠拢填满。
public boolean isCompleteTree(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
boolean reachedEnd = false;
while(!q.isEmpty()){
TreeNode cur = q.poll();
//第二步,出现了空节点以后,不能在出现非空节点了。
if(reachedEnd && cur != null){
return false;
}
//第一步出现了空节点了。
if(cur == null){
reachedEnd = true;
continue;
}
q.offer(cur.left);
q.offer(cur.right);
}
return true;
}