版权声明:本文为博主原创文章,未经博主允许不得转载,博客地址: https://blog.csdn.net/qq_31601743/article/details/89816517
题目描述
判断一棵二叉树是否为完全二叉树
完全二叉树
完全二叉树,即每一层都是要按从左往右,依此填满,最后一层可以不满,但是所有节点都集中在最左边,如图,图中1,2,3,4层节点的方向都是从左往右依此填充,每一层填充满了才进入下一层,最后不满,但是它也是从左往右依此填充的,节点都堆在最左边。
如下图,最后一层不是从左往右依此填充的,因此不为完全二叉树。
节点8和节点9中间隔离一个节点的空位,9应该在8的右边,整棵树才是完全二叉树。把黑色的节点9放到红色的节点9处,整棵树才是完全二叉树。
树的层次遍历
一棵树要从顶到底按层遍历,要完成先进先出的操作,因此,可以使用一个队列来完成,例如,按层遍历如下的树。
先把1进队列,然后出队,把1的左右节点2、3依此进队,2出队,把2的左右节点5、6依此进队,3出队,把3的左右节点7、8进队......依此类推,直到队列为空,整棵树按层遍历也就结束了。
判断是否为完全二叉树
一棵完全二叉树有以下两种情况。
1)节点有右孩子没有左孩子的情况下,返回false
2)不违反1的条件下,左右不全的节点,则按层次遍历的往后的节点都为叶子节点。
因此思路就是按层遍历,然后判断以上的两种情况,最后返回结果。
代码
public static boolean isCBT(Node head) {
if (head == null) {
return true;
}
Queue<Node> queue = new LinkedList<Node>();
boolean leaf = false;
Node l = null;
Node r = null;
queue.offer(head);
while (!queue.isEmpty()) {
head = queue.poll();
l = head.left;
r = head.right;
if ((leaf && (l != null || r != null))
|| (l == null && r != null)) {
return false;
}
if (l != null) {
queue.offer(l);
}
if (r != null) {
queue.offer(r);
} else {
leaf = true;
}
}
return true;
}
更多干货,请扫码关注“IT界的泥石流”微信公众号哦,带你领略编程之美!