如果满足两个条件就可以说这棵树是完全二叉树
1.一个节点如果有右孩子就一定有左孩子。
2.按照宽度优先遍历,在满足1的条件下如果有一个节点的左右子节点不双全的话,那么后面的节点一定都是叶子节点。
。
宽度优先遍历可以使用队列进行遍历。先将头结点放入队列中。
如果队列不为空,取出一个节点,打印,如果有左节点就将左节点放入队列中,如果有右节点就将右节点放入队列中,直到队列为空。
public static boolean checkCST(NodeTwo head) {
boolean flag = false;//表示是否遇到了不双全的子节点
NodeTwo l = null;
NodeTwo r = null;
Queue<NodeTwo> queue = new LinkedList<NodeTwo>();
//队列可以用LinkedList表示,
queue.add(head);
while(!queue.isEmpty()) {
head = queue.poll();
l = head.left;
r = head.right;
if(//左节点没有,有右节点,或者
//已经发现了左右节点不双全的节点,当前节点还有子节点。
(l==null && r!=null)
||
(flag && (l!=null||r!=null) )
) {
return false;
}
if(l!=null) {
queue.add(l);
}
if(r!=null) {
queue.add(r);
}
if(l!=null||r!=null) {
flag = true;
}
}
return true;
}