完全二叉树的判断
完全二叉树概念:
一颗近似满的二叉树,一定要保证前个结点的左右儿子都满的情况下,才可以继续向下层递伸
判断一颗树是否为完全二叉树:
1.先判断它是否存在节点,该节点的左儿子为空,而右儿子不为空,如果存在则返回false
2.在没有1的情况下,如果发现第一个左右儿子不全的节点(双空或是左不空右空),则后续遍历到的节点都是叶子节点(即左右儿子均为空)
代码及解析:
1 public static boolean isCBT(Node root) { 2 if (root == null) { 3 return false; 4 } 5 //已宽度优先遍历为基准进行处理 6 Queue<Node> q = new LinkedList<>(); 7 boolean leaf = false;//用于判断是否后续节点一定要是叶子节点 8 q.add(root); 9 while (q.size() > 0) { 10 Node t = q.poll(); 11 Node l = t.left; 12 Node r = t.right; 13 if (l != null) { 14 q.add(l); 15 } 16 if (r != null) { 17 q.add(r); 18 } 19 if ((leaf == true && (l != null || r != null)) || //后续一定要叶子节点,但不是叶子节点 20 (l == null && r != null)) {//左节点不为空,但右节点为空 21 return false; 22 } 23 if (l != null || r != null) {//说明这个节点已经不满,后续的节点一定都是叶子节点 24 leaf = true; 25 } 26 } 27 return true; 28 }