leetcode 102 层序遍历二叉树

59 阅读1分钟

该题一般情况下使用bfs进行广度优先遍历,那么就需要使用队列对数据进行存放进队、和出队,但是也是可以使用dfs进行深度优先遍历使用栈进行存放数据即可。

方法一:BFS是利用queue来进行每一层的数据的存放以及及时的出队,首先判断队列是否为空,在不为空的前提下,遍历队列的所有结点,并且将val加入list集合中,然后依次判断是否有左子节点、和右子节点,最后将list加入到lists即可。注意:对于遍历时的条件,应当将queue的长度抽取出来,不然会导致入队时使遍历条件逐渐增大,导致结果错误。代码如下

private Deque<TreeNode> queue = new ArrayDeque<>(20);
List<List<Integer>> lists = new ArrayList<>();

public List<List<Integer>> levelOrder(TreeNode root) {
    queue.addLast(root);
    BFS();
    return lists;
}

private void BFS() {
    while (!queue.isEmpty()) {
        List<Integer> list = new ArrayList<>();
        int length = queue.size();
        for (int i = 0; i < length; i++) {
            TreeNode node = queue.removeFirst();
            list.add(node.val);
            if (node.left != null) queue.addLast(node.left);

            if (node.right != null) queue.addLast(node.right);
        }
        lists.add(list);

    }

方法二 使用dfs进行深度遍历,可以使用一个int变量储存进入的层数,当没有进入到该层数时,直接提前创建list加入lists中,后面在对于左右节点进行dfs即可。注意:一定要注意int变量的取值,避免产生数组溢出异常或者空指针异常。 代码如下:

List<List<Integer>> lists = new ArrayList<>();

public List<List<Integer>> levelOrder(TreeNode root) {
    DFS(root,0);
    return lists;
}

private void DFS(TreeNode node, int count) {
    if (node == null) return;
    if (lists.size() < count) lists.add(new ArrayList<>());
    if (count-1 >= 0)lists.get(count-1).add(node.val);
    if (node.left != null) DFS(node.left,count+1);
    if(node.right != null) DFS(node.right,count+1);
}