二叉树的种类:
完美二叉树 | Perfect Binary Tree | Every node except the leaf nodes have two children and every level (last level too) is completely filled. 除了叶子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充。 |
---|---|---|
完全二叉树 | Complete Binary Tree | Every level except the last level is completely filled and all the nodes are left justified. 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。 |
完满二叉树 | Full/Strictly Binary Tree | Every node except the leaf nodes have two children. 除了叶子结点之外的每一个结点都有两个孩子结点。 |
我们这边用队列的方式,把每个树和孩子树添加到队列,然后每次取该树的头结点去进行操作
public static boolean isCBT(Node node) {
if (node == null) {
return true;
}
LinkedList<Node> queue = new LinkedList<>();
boolean leaf = false;
Node l = null;
Node r = null;
queue.add(node);
while (!queue.isEmpty()) {
node = queue.poll();
l = node.left;
r = node.right;
if ( //如果遇到不双全的节点之后,又发现了当前节点居然有孩子
(leaf && (l != null || r != null))
||
(l == null && r != null)//如果只有右节点没有左节点
) {
return false;
}
if (l != null) {
queue.add(l);
}
if (r != null) {
queue.add(r);
}
if (l == null || r == null) {//如果左为空或右为空
leaf = true;
}
}
return true;
}