二叉树的层级遍历,居然可以用递归

看这么一道题目,取自leetcode

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

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

    3
   / \
  9  20
    /  \
   15   7
   
返回其层次遍历结果:
[
  [3],
  [9,20],
  [15,7]
]

我想到的方法,是用栈来实现,把一层的结果同时入栈,再同时出栈,完成题目的要求,具体看代码。

    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> resList = new ArrayList<>();
        if(null == root) return resList;
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> leverList = new ArrayList<>();
            for(int i = 0; i < size; i++){ //同一层的元素放一起
                TreeNode node = queue.remove();
                leverList.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);               
            }
            resList.add(leverList);
        }
        return resList;
    }

看了别人的题解,居然用递归,很简洁的实现了。觉得人家实现的很巧妙,贴出来,记录下。

	public List<List<Integer>> levelOrder(TreeNode root) {
        recurse(root, 0);
        return resList;
    }
    List<List<Integer>> resList = new ArrayList<>();
    private void recurse(TreeNode node, int level){
        if(node == null) return;
        if(level == resList.size()){  // 这个判断十分巧妙,简洁的实现了首次进入,加空集合。
            resList.add(new ArrayList<Integer>());
        }
        resList.get(level).add(node.val);
        recurse(node.left, level + 1);
        recurse(node.right, level + 1);
    }

用递归来实现,很简洁,不用复杂的运算,大写的服!

你可能感兴趣的:(算法与数据结构,二叉树,递归,层遍历)