以勒先生刷力扣之:102. 二叉树的层序遍历(一)

102. 二叉树的层序遍历(一)

注意:这里是一哦,也就是说后面还有二~~~

题目

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

思路

这个题吧,一看是一层一层的输出,你肯定会第一个想到的是bfs,反正我觉得这个题用bfs的方法是容易理解的。
那么按着bfs的老套路来建立一个队列,将根节点放进去,随后就是无脑的while队列不为null,按着常理这里是要弹出了对不对,但是!这里不能直接弹出,你直接弹出还玩个锤子,人家让把每一层的元素加入一个list中,那我的意思是先定义一个list再弹出来加入根节点?那如果不是根节点,第二层右俩元素,你弹出来第一个加了,同时这轮while循环之后肯定会往这个队列中加入新的左右节点,那你如何来判断这一层的元素个数来进行这一层的list加几个的操作呢?你不会告诉我每一层的元素个数是2的幂吧,弟弟,那为null的情况怎么办呢?
所以让我们回到我那个加感叹号的但是那里,这里要做的就是用一个size变量来得到此刻队列的长度,此时这个长度就是这一层的元素个数,你想想对不对?
为嘛?
你别急,把这个长度搞出来之后,下面要弹出来了对不?我们先整一个新的list用于加入这一层的节点元素,随后下面用一个for循环,从0开始到size-1,就是把这个长度段的元素加进来,后面的就不是这一层的,要放到下一层去加。
所以到这个地方你是不是有点想法了?
用bfs思路是没错的,问题的重点是在于每一层长度的控制上,所以再每一次开始的时候用size进行长度的控制,比如第一轮只有根节点,那么size肯定是1,随后一轮while,那么假设其子节点都不为null的时候,这一轮之后队列长度为2,就是第二层的长度,以此类推。
上面就是解释了这个题的关键部分。
那么进行for循环时,还要记得判断弹出来的这个元素是否为null,null就放过,不null才加,这一步你可以在加下一层节点的时候进行判断,会显的更加有分寸,具体看代码。

public List<List<Integer>> levelOrder(TreeNode root) {
        if (root==null){
            return new ArrayList<List<Integer>>();
        }
        List<List<Integer>> lists=new ArrayList<>();//最后要返回的结果list
        LinkedList<TreeNode> queue=new LinkedList();
        queue.add(root);
        while (!queue.isEmpty()){
            int size=queue.size();
            ArrayList<Integer> arrayList=new ArrayList();
            for (int i = 0; i <size ; i++) {
                TreeNode treeNode = queue.poll();
                arrayList.add(treeNode.val);
                if (treeNode.left!=null){//在这里判断不为null
                    queue.add(treeNode.left);
                }
                if (treeNode.right!=null){
                    queue.add(treeNode.right);
                }
            }
            lists.add(arrayList);//将每一层的那个list加入
        }

    return lists;
    }

你以为到这里就结束了嘛?

DFS

弟弟啊,递归可以解决的问题,我们还是稍微考虑一下,锻炼锻炼脑力。
首先dfs是一直的往下进行,那加入每一层的话就有一点尴尬了,那也就是说我们肯定需要新建一个函数,这个函数的参数中必须要有一个index变量来表示这到了哪一层
,这样的话我们只要判断这个index到了哪一层,然后把对应的这一层的元素加入到list中,具体怎么实施呢?

创建新的函数,参数为index,当前节点,还有最后要返回的那个lists。
先进行的判断是lists的长度和index的比较,比如说index==3,说明递归到第三层,但是lists的长度只有2,说明其中只有两层的list,这个时候我们就再lists中增加一个新的列表,这个list代表的就是第三层的list。这个if就解决了每一次循环虽然是不同的层,但是我每一层的list有了,那么剩下的就是把每一层的元素加进来。
所以下一步就是加元素,加的方法就是lists中的第index-1个list加上这个节点的值,当然前提是这个节点不为null,这个null的判断方法和上面的那个一样,在加入节点的时候进行判断。随后进行的就是关于这个节点的左右节点的递归啦,接下来看代码。

 public void dfs(int index,TreeNode treeNode,List<List<Integer>> lists){
        if (lists.size()<index){
            lists.add(new ArrayList<Integer>());
        }
        lists.get(index-1).add(treeNode.val);
        if (treeNode.left!=null){
            dfs(index+1,treeNode.left,lists);
        }
        if (treeNode.right!=null){
            dfs(index+1,treeNode.right,lists);
        }
    }

在主函数中的方法调用为:

public List<List<Integer>> levelOrder(TreeNode root) {
  	 if (root==null){
            return new ArrayList<List<Integer>>();
        }
        List<List<Integer>>  lists=new ArrayList<>();
        dfs(1,root,lists);
        return lists;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值