大家好,又见面了,我是你们的朋友全栈君。
完全二叉树的定义: 一棵二叉树,除了最后一层之外都是完全填充的,并且最后一层的叶子结点都在左边。
https://baike.baidu.com/item/完全二叉树/7773232?fr=aladdin
百度定义
思路:层序遍历二叉树
如果一个结点,左右孩子都不为空,则pop该节点,将其左右孩子入队列
如果一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树
如果一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空:::::则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则返回false。
非完全二叉树的例子(对应方法的正确性和必要性):
下面写代码:
定义结点:
代码语言:javascript复制 public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
方法:
代码语言:javascript复制 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;
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158639.html原文链接:https://javaforall.cn