二叉树的层序遍历

79 阅读1分钟

思路

利用队列先进先出的特点,每一层作为一个队列。每次遍历时,遍历队列size大小的次数,遍历每个节点时,出队加入到一个临时链表里,并入这个节点的下一个节点,完成一次遍历后将临时链表放入存链表的链表里,并new一个临时链表。

代码

ArrayList<List<Integer>> lists = new ArrayList<>();
Queue<TreeNode> treeNodes = new LinkedList<>();
if (root == null) return lists;
treeNodes.offer(root);
while (!treeNodes.isEmpty()) { // 如果队列不为空的时候
    ArrayList<Integer> list = new ArrayList<>();
    int len = treeNodes.size();
    while (len > 0) {
        TreeNode poll = treeNodes.poll();
        list.add(poll.val);
        if (poll.left != null) treeNodes.offer(poll.left);
        if (poll.right != null) treeNodes.offer(poll.right);
        len--;
    }
    lists.add(list);
}
return lists;

此处需要注意的是,在每次遍历结束后,不能使用list.clear(),而是在下一次遍历前new一个list,因为使用list.clear()会使list中的元素被清空,而lists中指向了改list,导致加入到lists的元素也被清空。 而new之后是全新的一个对象,并不会影响之前的对象,而之前的list也被指向,所以不会被垃圾回收器所回收