题目描述
Given a binary tree, determine if it is a complete binary tree.
Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.
题目链接
https://leetcode.com/problems/check-completeness-of-a-binary-tree/
方法思路
Approach1:
思路就是先序遍历得到的是二叉树真实的节点数,而层序遍历并不一定,对比二者就可得出是否为完全二叉树。
class Solution {
//Runtime: 1 ms, faster than 99.19%
//Memory Usage: 36.9 MB, less than 57.43%
int dfs_count;
public boolean isCompleteTree(TreeNode root) {
int bfs_count = 0;
dfs_count = 0;
bfs_count = levelOrderTraverse(root);
preOrderTraverse(root);
return bfs_count == dfs_count ? true : false;
}
private int levelOrderTraverse(TreeNode root){
Queue<TreeNode> queue = new LinkedList<>();
int countNodes = 0;
queue.offer(root);
countNodes++;
while(!queue.isEmpty()){
TreeNode node = queue.poll();
if(node.left != null) {
queue.offer(node.left);
countNodes++;
}else
return countNodes;
if(node.right != null) {
queue.offer(node.right);
countNodes++;
}else
return countNodes;
}
return countNodes;
}
private void preOrderTraverse(TreeNode root){
if(root == null) return;
dfs_count++;
preOrderTraverse(root.left);
preOrderTraverse(root.right);
}
}
Approach2:
Use BFS to do a level order traversal,
add childrens to the bfs queue,
until we met the first empty node.
For a complete binary tree,
there should not be any node after we met an empty one.
class Solution {
//Runtime: 1 ms, faster than 99.19%
//Memory Usage: 36.8 MB, less than 57.43%
public boolean isCompleteTree(TreeNode root) {
Queue<TreeNode> bfs = new LinkedList<TreeNode>();
bfs.offer(root);
while (bfs.peek() != null) {
TreeNode node = bfs.poll();
bfs.offer(node.left);
bfs.offer(node.right);
}
while (!bfs.isEmpty() && bfs.peek() == null)
bfs.poll();
return bfs.isEmpty();
}
}