前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode刷题(49)——102. 二叉树的层次遍历

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

作者头像
老马的编程之旅
发布2022-06-22 13:40:05
1690
发布2022-06-22 13:40:05
举报
文章被收录于专栏:深入理解Android

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

例如: 给定二叉树: [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也是没有创建的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档