Leetode刷题之路:[102. 二叉树的层序遍历]

题目描述

102.二叉树的层序遍历

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

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

示例:

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

题解一:BFS

一看就是使用BFS,但是需要将每一层的结果单独保存,因此BFS的时候需要创建两个Queue,一个保存父级的点,一个保存子级的点。

首先遍历queue1得到父级对应的子级,然后遍历queue2得到当前点的value,添加到List中,将List添加到result中,然后将子级的点复制给父级,清空子级队列

class Solution {
    //BFS
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        //queue1是父层,queue2是从左到右的子层,通过子层赋值给父层达到一层层遍历的目的
        Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
        Queue<TreeNode> queue2 = new LinkedList<TreeNode>();

        List<Integer> temp = new ArrayList<>();
        queue1.offer(root);
        temp.add(root.val);
        result.add(temp);
        while (!queue1.isEmpty()) {
            while (!queue1.isEmpty()) {
                // System.out.println(temp);
                root = queue1.poll();
                if (!(root.left==null)) {
                    queue2.offer(root.left);
                }
                if (!(root.right==null)) {
                    queue2.offer(root.right);
                }
                
            }
            temp = new ArrayList<>();
            for(TreeNode q : queue2){
                temp.add(q.val);
            }
            if (!temp.isEmpty()) {
                result.add(temp);
            }

            queue1.addAll(queue2);
            queue2.clear();
        }
        return result;
    }
}

首先,自己写出来了,但是效果不太好,然后尝试着进行一下优化,嗯,发现优化之后没效果,还是看看别人的吧。。。

在这里插入图片描述

看一下官方的BFS代码吧,哈哈哈思路大体差不多,只是少创建了一个queue,使用了for替代了queue的作用,彼此彼此哈哈

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();

    Queue<TreeNode> queue = new ArrayDeque<>();
    if (root != null) {
        queue.add(root);
    }
    while (!queue.isEmpty()) {
        int n = queue.size();
        List<Integer> level = new ArrayList<>();
        for (int i = 0; i < n; i++) { 
            TreeNode node = queue.poll();
            level.add(node.val);
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        res.add(level);
    }

    return res;
}

题解二:DFS使用Map

我先使用遍历一遍,给每一层都打上一个标签表示当前层次,后来发现还不如法一简单呢,然后就放弃了,但是看到题解里面有人用,于是我就去学习了一下,看到使用的c++,然后看到了一个level+1,我突然想到了中序遍历的递归时候可以传进来一个level,然后下一层就加一就好了,我就又去写了一遍递归的做法

class Solution {
    //递归
    Map<Integer,List<Integer>> map = new HashMap<>();

    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        help(root,1);
        for(Integer key : map.keySet()) {
            result.add(map.get(key));
        }
        return result;
    }

    public void help(TreeNode node,Integer level){
        if (node==null) {
            return ;
        }
        if (map.containsKey(level)) {
            List<Integer> list = map.get(level);
            list.add(node.val);
            map.put(level,list);
        } else {
            List<Integer> list = new ArrayList<>();
            list.add(node.val);
            map.put(level,list);
        }
        help(node.left,level+1);
        help(node.right,level+1);
    }
}

嗯,效果还不错哈哈
在这里插入图片描述
后来我才发现这个是DFS的应用,真是好玩哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笼中小夜莺

嘿嘿嘿,请用金钱尽情地蹂躏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值