算法题—完全二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载,博客地址: 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界的泥石流微信公众号哦,带你领略编程之美!

猜你喜欢

转载自blog.csdn.net/qq_31601743/article/details/89816517