Java代码实现判断一颗二叉树是否为完全二叉树
时间: 2023-08-21 07:05:50 浏览: 148
isCompleteBinaryTree.zip_spellpt3_判断是否完全二叉树
可以使用层次遍历的方式进行判断。具体步骤如下:
1. 对于一颗完全二叉树,如果节点i有左子树,那么节点i+1一定有左子树,如果节点i没有左子树了,那么节点i+1及以后的节点都没有左子树。
2. 对于一颗完全二叉树,如果节点i没有右子树,那么节点i+1及以后的节点都没有右子树。
3. 如果在遍历过程中出现了一个节点没有左子树或者右子树,但是后续节点却有子树,那么这棵树就不是完全二叉树。
下面是Java代码实现:
```java
import java.util.LinkedList;
import java.util.Queue;
public class CompleteBinaryTree {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public static boolean isCompleteBinaryTree(TreeNode root) {
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean leafNode = false;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
// 如果出现了一个节点没有左子树或者右子树,但是后续节点却有子树,那么这棵树就不是完全二叉树
if (node.left == null && node.right != null) {
return false;
}
// 如果此时已经出现过叶子节点,但是后续节点却有子树,那么这棵树就不是完全二叉树
if (leafNode && (node.left != null || node.right != null)) {
return false;
}
if (node.left != null) {
queue.offer(node.left);
} else {
// 如果此时已经出现了叶子节点,但是后续节点却没有子树,那么这棵树就不是完全二叉树
leafNode = true;
}
if (node.right != null) {
queue.offer(node.right);
} else {
// 如果此时已经出现了叶子节点,但是后续节点却没有子树,那么这棵树就不是完全二叉树
leafNode = true;
}
}
return true;
}
public static void main(String[] args) {
// 测试用例
// 完全二叉树
// 1
// / \
// 2 3
// / \ / \
// 4 5 6
TreeNode root1 = new TreeNode(1);
root1.left = new TreeNode(2);
root1.right = new TreeNode(3);
root1.left.left = new TreeNode(4);
root1.left.right = new TreeNode(5);
root1.right.left = new TreeNode(6);
System.out.println(isCompleteBinaryTree(root1)); // true
// 非完全二叉树
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
TreeNode root2 = new TreeNode(1);
root2.left = new TreeNode(2);
root2.right = new TreeNode(3);
root2.left.left = new TreeNode(4);
root2.left.right = new TreeNode(5);
root2.right.left = new TreeNode(6);
root2.right.right = new TreeNode(7);
System.out.println(isCompleteBinaryTree(root2)); // false
}
}
```
阅读全文