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)

  1. level从0开始, 如果level >= list的大小, 那么添加一个listnode
  2. 否则把node加到原node的前面
  3. 所以要从右子节点开始, 再到左子节点
    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;

results matching ""

    No results matching ""