leetcode刷题(49)——102. 二叉树的层次遍历

2022-06-22 13:40:05 浏览数 (1)

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

例如: 给定二叉树: [3,9,20,null,null,15,7],

代码语言:javascript复制
  3
   / 
  9  20
    /  
   15   7

返回其层次遍历结果:

代码语言:javascript复制
[
  [3],
  [9,20],
  [15,7]
]

方法1:第一时间想到就是广度优先算法,我们知道队列是配合进行广度优先的,先看代码

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList();
        ArrayList<List<Integer>> outList = new ArrayList();
        if(root==null){
            return outList;
        }
        queue.add(root);
        while(!queue.isEmpty()){
            ArrayList<Integer> list = new ArrayList();
             int level_length = queue.size();
            for(int i=0;i<level_length;i  ){
                TreeNode node = queue.remove();
                list.add(node.val);
                 if(node.left!=null){
                    queue.add(node.left);
                }
                if(node.right!=null){
                    queue.add(node.right);
                }
            }
            outList.add(list);
           
        }
        return outList;
    }
}

这里巧妙一处在于,for循环的范围是level_length,这样即使当在for循环中queue添加了节点,也是会到下一层了,如果是直接用queue.size();会一直都在一层

方法2:使用递归,进行深度优先,所有二叉树的深度优先都可以通过递归进行完成

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        ArrayList<List<Integer>> outList = new ArrayList();
        if(root==null){
            return outList;
        }
        helper(outList,root,0);
        
        return outList;
    }

    public void helper(ArrayList<List<Integer>> list,TreeNode root,int level){
        if(list.size()==level){
            ArrayList<Integer> levelList =  new ArrayList<>();
            list.add(levelList);
        }
        list.get(level).add(root.val);
        if(root.left!=null){
            helper(list,root.left,level 1);
        }
        if(root.right!=null){
            helper(list,root.right,level 1);
        }
    }
}

注意:这里的关键之处在于list.size()==level,按照深度优先的情况,确实每一层的第一个node添加时list.size()==level,我刚开始想用list.get(level)==null来判断,然后创建levelList,但这样会出现每一层第一个元素时候,都会爆角标越界,因为刚开始本层还没node时,该层的list也是没有创建的。

0 人点赞