LeetCode第102题107题 二叉树的层次遍历 — 一招鲜吃遍天~

2024-04-02 21:38

本文主要是介绍LeetCode第102题107题 二叉树的层次遍历 — 一招鲜吃遍天~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
不是很理解,同样是二叉树的层次遍历问题, 102题是Medium ,107题是 Easy 😂 多年的强迫症又犯了😭

在这里插入图片描述
LeetCode第 102 题 题目(Medium):

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

LeetCode第 107 题 题目(Easy):

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

说在前面:

树的遍历问题无非两种方法:

  • 深度优先遍历(DFS):从根节点开始一直到达某个叶子节点,然后再返回根节点到达另一个分支。(根据根节点、左孩子、右孩子的相对顺序分为先序遍历中序遍历后序遍历
  • 广度优先遍历(BFS):一层层的访问树,高层次的节点比低层次的节点先被访问到。

解题思路:

  1. 创建List<List>集合,存放result;(泛型List用于存储每一层的节点)

  2. 使用Queue存放本层的节点,使用List接收队列每次存放的值

  3. 如果当前节点有孩子节点,把孩子节点入队,再放入List

  4. List放入List<List>

小名拿第102题示例来给大家模拟下待会code的过程:

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

    3/ \9  20/  \15   7
层数SizeQueueNodeList
第一层1[3] [9] [20][3][3]
第二层2[9] [20] [15] [7][9][3]
[9]
[9] [20] [15] [7][20][3]
[9] [20]
第三层2[15] [7][15][3]
[9] [20]
[15]
[15] [7][7][3]
[9] [20]
[15] [7]

Coding~

102 题

 public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while(!queue.isEmpty()){int size = queue.size();List<Integer> level = new ArrayList<>();//存放每一层的节点for(int i = 0 ; i < size ; i++){TreeNode poll = queue.poll();level.add(poll.val);//将队列pop出来的节点,存到list中if(poll.left != null) queue.add(poll.left);//将左孩子add到队列中if(poll.right != null) queue.add(poll.right);//将有孩子add到队列中}result.add(level);}return result;}

107 题

public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> result = new ArrayList<>();if(root == null) return result;Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {int size = queue.size();//每一层有几个节点List<Integer> level = new ArrayList<>();//用于存放每一层的节点for (int i = 0; i < size; i++) {TreeNode poll = queue.poll();level.add(poll.val);//将队列pop出来的节点,存到list中if (poll.left != null) queue.add(poll.left);//将左孩子add到队列中if (poll.right != null) queue.add(poll.right);//将有孩子add到队列中}//指定每一层的集合都加在 0 这个位置,保证最后一层在最前面result.add(0,level);}return result;
}

注意!

上面的code只有一处不同,就是在于result.add(level);result.add(0,level);的区别

在源码中List的add方法:

/*** Appends the specified element to the end of this list (optional* operation).** <p>Lists that support this operation may place limitations on what* elements may be added to this list.  In particular, some* lists will refuse to add null elements, and others will impose* restrictions on the type of elements that may be added.  List* classes should clearly specify in their documentation any restrictions* on what elements may be added.** @param e element to be appended to this list* @return <tt>true</tt> (as specified by {@link Collection#add})* @throws UnsupportedOperationException if the <tt>add</tt> operation*         is not supported by this list* @throws ClassCastException if the class of the specified element*         prevents it from being added to this list* @throws NullPointerException if the specified element is null and this*         list does not permit null elements* @throws IllegalArgumentException if some property of this element*         prevents it from being added to this list*/
boolean add(E e);
/*** Inserts the specified element at the specified position in this list* (optional operation).  Shifts the element currently at that position* (if any) and any subsequent elements to the right (adds one to their* indices).** @param index index at which the specified element is to be inserted* @param element element to be inserted* @throws UnsupportedOperationException if the <tt>add</tt> operation*         is not supported by this list* @throws ClassCastException if the class of the specified element*         prevents it from being added to this list* @throws NullPointerException if the specified element is null and*         this list does not permit null elements* @throws IllegalArgumentException if some property of the specified*         element prevents it from being added to this list* @throws IndexOutOfBoundsException if the index is out of range*         (<tt>index &lt; 0 || index &gt; size()</tt>)*/
void add(int index, E element);

我们可以看出:add(E e)将指定的元素添加到此列表的尾部。而add(int index,E element) 将指定的元素插入此列表中的指定位置。

最后我们来测试一下吧~
在这里插入图片描述

public static void main(String[] args) {TreeNode treeNode = new TreeNode(3);treeNode.left = new TreeNode(9);treeNode.right = new TreeNode(20);treeNode.right.left = new TreeNode(15);treeNode.right.right = new TreeNode(7);levelOrder order = new levelOrder();List<List<Integer>> lists = order.levelOrder(treeNode);/*levelOrderBottom order = new levelOrderBottom();List<List<Integer>> lists = order.levelOrderBottom(treeNode);*/System.out.println(lists);
}

在这里插入图片描述

这篇关于LeetCode第102题107题 二叉树的层次遍历 — 一招鲜吃遍天~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871123

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划