完全二叉树
子节点从左往右生长,一层生长完全才可以生长下一层.
解题思路:
横向遍历(按层)二叉树的过程中,每个节点的子节点有以下四种情况:
1-左右都没有 : 该节点为叶子节点
2-左右都有: 没啥说的,一个没什么幺蛾子的节点.
3-有右没左 : 出现这种情况直接返回false,这种情况违反完全二叉树的定义
4-有左没右 : 出现此种情况,证明该节点的左节点应该是最后一层的最后一个节点,其后面遍历到的节点都必须是叶子节点.否则该树不是完全二叉树.
横向遍历二叉树的思路:
将二叉树的节点放入队列中,弹出一个节将它的子节点先左后右压入队列中.直到队列为空.
扫描二维码关注公众号,回复:
11283293 查看本文章
整体代码如下:
public static boolean isCBT(Node head){
if(head == null){
return true; //空节点是完全二叉树
}
Queue<Node> queue = new LinkedList<Node>();
queue.offer(head);
Node left = null;
Node right = null;
boolean isLeaf = false;
while(!queue.isEmpty()){
head = queue.poll();
left = head.left;
right = head.right;
//判断是否是有右节点没有左节点的情况 : (isLeaf && (left != null || right != null))
//判断出现第四种情况(有右没左)时,后边的节点是不是都是叶节点 : (isLeaf && (left != null || right != null))
if((isLeaf && (left != null || right != null)) || (left == null && right != null)){
return false;
}
if(head.left != null){
queue.offer(left);
}else if(right != null){
queue.offer(right);
}else{
isLeaf = true;
}
}
return true;
}