238 字 1 分钟阅读

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例: 二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层序遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

思路

可以用过队列和递归两种方法实现

解法

1. 队列BFS

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root);

        while (!deque.isEmpty()) {
            //获取当前层节点数量
            int len = deque.size();
            List<Integer> list = new ArrayList<>();

            //将该层数据放入result
            while (len > 0 && !deque.isEmpty()) {
                root = deque.poll();
                list.add(root.val);
                if (root.left != null) {
                    deque.offer(root.left);
                }
                if (root.right != null) {
                    deque.offer(root.right);
                }
                len--;
            }
            result.add(list);
        }
        return result;
    }
}

2. 递归DFS

class Solution {

    List<List<Integer>> resList = new ArrayList<>();
    
    public List<List<Integer>> levelOrder(TreeNode root) {
        getNode(root, 0);
        return resList;
    }

    public static void getNode(TreeNode root, int level) {
        if (root == null) {
            return;
        }
        level++;
        if(resList.size() < level){
            //当层级增加时,list的item也增加,利用list的索引值进行层级界定
            List<Integer> item = new ArrayList<>();
            resList.add(item);
        }
        resList.get(level - 1).add(root.val);
        getNode(root.left, level);
        getNode(root.right, level);
    }
}

3. 迭代DFS

使用两个栈,一个栈维护节点数据,一个栈维护节点所在深度。把相同深度的节点放入同一个list中即可。

class Solution {
    
    public List<List<Integer>> levelOrder(TreeNode root) {

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

        if (root == null) {
            return resList;
        }

        int curDepth = 0;
        //存放节点
        Stack<TreeNode> dataStack = new Stack<>();
        //存放节点对应深度
        Stack<Integer> depthStack = new Stack<>();

        dataStack.push(root);
        depthStack.push(0);

        while (!dataStack.isEmpty()) {
            root = dataStack.pop();
            curDepth = depthStack.pop();
            curDepth++;
            if (curDepth > resList.size()) {
                resList.add(new ArrayList<>());
            }
            resList.get(curDepth - 1).add(root.val);

            if (root.right != null) {
                dataStack.push(root.right);
                depthStack.push(curDepth);
            }
            if (root.left != null) {
                dataStack.push(root.left);
                depthStack.push(curDepth);
            }
        }

        return resList;
    }
}