【44.二叉树的层序遍历】

59 阅读1分钟

题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: [[3],[9,20],[15,7]]

题解

方式一:BFS

一次性把整层处理完再处理下一层

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> result = new LinkedList<>();
    if (root == null) {
        return result;
    }
    Deque<TreeNode> deque = new LinkedList<>();
    deque.offer(root);
    while (!deque.isEmpty()) {
        int size = deque.size();
        List<Integer> list = new LinkedList<>();
        // 处理当前层数据
        while (size > 0) {
            TreeNode node = deque.poll();
            list.add(node.val);
            // 保证从左到右
            if (node.left != null) {
                deque.offer(node.left);
            }
            if (node.right != null) {
                deque.offer(node.right);
            }
            size--;
        }
        result.add(list);
    }
    return result;
}

方式二:DFS

单独处理每个节点,放入对应层

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> result = new LinkedList<>();
    dfs(root, 0, result);
    return result;
}

public void dfs(TreeNode node, int deep, List<List<Integer>> result) {
    // 结束递归条件
    if (node == null) {
        return;
    }
    // 计算当前节点的层数
    deep++;
    if (result.size() < deep) {
        List<Integer> list = new LinkedList<>();
        result.add(list);
    }
    // 放入对应层数集合
    result.get(deep - 1).add(node.val);
    // 保证从左到右
    dfs(node.left, deep, result);
    dfs(node.right, deep, result);
}

总结

算法:BFSDFS