题目描述
- 考察对完全二叉树性质的理解
![【LeetCode笔记】958. 二叉树的完全性检验(Java、二叉树、BFS)_第1张图片](http://img.e-com-net.com/image/info8/40b05da935d34166bf5ec51d7944293d.jpg)
思路 && 代码
层级遍历法
- 一开始试了自底向上的DFS,过了90%的用例,还是考虑得不够全 = =
- 层级遍历:代码比较多,但是总体效率和方法2差不多
class Solution {
Deque<TreeNode> queue = new ArrayDeque<>();
public boolean isCompleteTree(TreeNode root) {
queue.offer(root);
return bfs(1, 1);
}
public boolean bfs(int nodeNums, int except) {
if(queue.size() == 0) {
return true;
}
int counts = 0;
boolean flag = false;
for(int i = 0; i < nodeNums; i++) {
TreeNode tempNode = queue.pop();
if(tempNode.left != null) {
if(flag) {
return false;
}
queue.offer(tempNode.left);
counts++;
}
else {
flag = true;
}
if(tempNode.right != null) {
if(flag) {
return false;
}
queue.offer(tempNode.right);
counts++;
}
else {
flag = true;
}
}
if(nodeNums != except && !queue.isEmpty()) {
return false;
}
return bfs(counts, 2 * except);
}
}
BFS
- 注意:要使用能存储 null 值的集合类(比如 ArrayDeque 就不行)
- 核心思路:当前节点为空时,如果后面(包括右边、下面)有节点则不是完全二叉树。
class Solution {
public boolean isCompleteTree(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
for(TreeNode cur = queue.poll(); cur != null; cur = queue.poll()) {
queue.offer(cur.left);
queue.offer(cur.right);
}
while(!queue.isEmpty()) {
if(queue.poll() != null) {
return false;
}
}
return true;
}
}
二刷
class Solution {
public boolean isCompleteTree(TreeNode root) {
List<TreeNode> list = new LinkedList<>();
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
list.add(root);
while(!queue.isEmpty()) {
TreeNode temp = queue.poll();
list.add(temp.left);
list.add(temp.right);
if(temp.left != null) {
queue.offer(temp.left);
}
if(temp.right != null) {
queue.offer(temp.right);
}
}
boolean flag = false;
for(TreeNode temp : list) {
if(temp == null) {
flag = true;
} else if (flag) {
return false;
}
}
return true;
}
}
class Solution {
public boolean isCompleteTree(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<>();
for(TreeNode cur = root; cur != null; cur = queue.poll()) {
queue.offer(cur.left);
queue.offer(cur.right);
}
while(!queue.isEmpty()) {
if(queue.poll() != null) {
return false;
}
}
return true;
}
}