1.2 Check if a binary tree is complete
While traversing, cannot meet more nodes after meeting a null
Input: TreeNode root
Output: boolean if the tree is completed
Corner case: if input is null, return true
Data structure: queue
Solution: (Breadth First Research, to deal with logical relation on the same level)
Expand one node at a time, use boolean flag to indicate if the node has been expanded
Generate its left child, if null, flag = true, not null && not visited, q.offer(),
generate its right child, same as above
TC: n = # of nodes in the tree = O(n)
SC: O(n)
public boolean isComplete(TreeNode root) {
if (root == null) { return true; }
Queue<TreeNode> queue = new LinkedList<>();
boolean flag = false;
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur.left == null) {
flag = true;
} else if (flag) {
return false;
} else { //flag = false && cur.left != null
queue.offer(root.left);
}
if (cur.right == null) {
flag = true;
} else if (flag) {
return false;
} else { //flag = false && cur.right != null
queue.offer(root.right);
}
}
return true;
}
Same logic and idea could be applied to similar problems such as printing tree level by level when using BreadthFS.
However, record the size of the queue every time first before generating the next level.
Input: TreeNode root
Output: List<List<Integer>> key of each node printed level by level from left to right
public List<List<Integer>> printTree(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) { return res; }
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> curLevel = new ArrayList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode cur = queue.poll();
curLevel.add(cur.key);
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
res.add(curLevel);
}
return res;
}
Last updated
Was this helpful?