Problem
Given a binary tree, design an algorithm which creates a linked list of all the nodes at each depth (e.g., if you have a tree with depth D, you'll have D linked lists).
Have you met this question in a real interview? Yes
Example
Given binary tree:
1
/ \
2 3
/
4
return
[
1->null,
2->3->null,
4->null
]
思路一(dfs)
- level从0开始, 如果level >= list的大小, 那么添加一个listnode
- 否则把node加到原node的前面
- 所以要从右子节点开始, 再到左子节点
public List<ListNode> binaryTreeToLists(TreeNode root) {
List<ListNode> result = new ArrayList<>();
helper(result, root, 0);
return result;
}
private void helper(List<ListNode> result, TreeNode root, int level) {
if (root == null) return;
ListNode curt = new ListNode(root.val);
if (level >= result.size()) {
result.add(curt);
} else {
curt.next = result.get(level);
result.set(level, curt);
}
helper(result, root.right, level + 1);
helper(result, root.left, level + 1);
}
思路二(bfs)
public List<ListNode> binaryTreeToLists(TreeNode root) {
List<ListNode> result = new ArrayList<ListNode>();
if (root == null)
return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
ListNode dummy = new ListNode(0);
ListNode lastNode = null;
while (!queue.isEmpty()) {
dummy.next = null;
lastNode = dummy;
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode head = queue.poll();
lastNode.next = new ListNode(head.val);
lastNode = lastNode.next;
if (head.left != null)
queue.offer(head.left);
if (head.right != null)
queue.offer(head.right);
}
result.add(dummy.next);
}
return result;