本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41929059

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

return its level order traversal as:

  1. [
  2. [3],
  3. [9,20],
  4. [15,7]
  5. ]

思路:

(1)题意为给定一颗二叉树,按层次输出每层对应的值。

(2)本文主要运用队列来操作树中每层节点。为了避免每次从根节点开始遍历,在我们对地第m层进行访问时,只需知道m-1层节点信息即可,这样就无需每次都从根节点开始访问,从而可以提高效率。

(3)这里设置两个标记位first和last来记录当前层待访问的节点位置和当前层最后一个节点的下一个节点的位置。

(4)解题思路大致为:如果根节点不为空,将根节点加入当前队列,初始化标记位first为0,即为当前队列中待访问的第一个节点,初始化标记位last为1,即为当前队列中元素个数。如果first小于队列大小,即在队列中对应在first位置的节点存在,则进入循环准备遍历第一层元素,last指向队列中最后一个元素的下一个位置,如果first<last,说明该层还有元素未被访问,将first位置对应的节点存入临时存储每层节点的链表中,如果该位置的左右节点不为空,则分别将左右节点存入当前链表中,已经遍历完一个节点,此时first++,即指向下一个待遍历的节点,循环直到first==last,说明当前层节点全部遍历完,将临时链表存入待输出的队列中;然后接着遍历第二层,依次类推,直到遍历到最后一层最后一个节点时,此时last等于当前队列元素个数,跳出循环,返回结果。

(5)对于题目中的示例,下面给出其执行过程:

A:将根节点3加入当前队列all中,初始化first=0,last=1

B:由于first<all.size()=1,说明first所对应位置在all中存有节点,此时last执行all最后一个节点3所在位置0的下一个位置1

C:由于first<last,当前层未遍历,取出first所对元素3存入临时链表level中,继续看该节点的下层孩子节点,即其左右节点是否为空

D:不为空则将9和20加入队列,此时,first所指元素已遍历完,first指向下一个元素,first++,此时first=last,说明第一层遍历完了

E:接着遍历第二层,第二层开始位置为1,即从节点9开始遍历,......

F:这里需要注意的是:每遍历到一个节点,将其左右节点加入队列的顺序必须为先左后右,这样才能保证输出顺序的正确性。

(6)本文主要考察对队列的应用,特别是其“先进先出”的特性,能够保证每层都是按照从左到右的顺序输出。

(7)希望本文对你有所帮助。谢谢。

算法代码实现如下所示:

  1. public static List<List<Integer>> levelOrder(TreeNode root) {
  2. List<List<Integer>> result = new LinkedList<List<Integer>>();
  3. //注意root为空时不能返回null
  4. if (root == null)
  5. return result;
  6.  
  7. List<TreeNode> all = new LinkedList<TreeNode>();
  8. all.add(root);
  9. int first = 0; //当前待访问节点,初始为第一个节点,即根节点
  10. int last = 1; //当前链表中元素个数,初始只有一个
  11. while (first < all.size()) { //如果待访问节点存在于链表
  12. last = all.size(); //下一行访问开始,定位last为当前行最后一个节点下一个节点所在位置
  13. List<Integer> level = new LinkedList<Integer>();
  14. while (first < last) { //如果first==last表示该行所有节点都被访问到了,跳出循环
  15. level.add(all.get(first).val);
  16. if (all.get(first).left != null) {
  17. all.add(all.get(first).left);
  18. }
  19. if (all.get(first).right != null) {
  20. all.add(all.get(first).right);
  21. }
  22. first++; //每访问完一个节点就指向下一个节点
  23. }
  24. result.add(level);
  25. }
  26. return result;
  27. }

Leetcode_102_Binary Tree Level Order Traversal的更多相关文章

  1. [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  2. [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  3. 【leetcode】Binary Tree Level Order Traversal I & II

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  4. LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树

    Binary Tree Level Order Traversal 题目描述: Given a binary tree, return the level order traversal of its ...

  5. 35. Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal OJ: https://oj.leetcode.com/problems/binary-tree-level-order-trave ...

  6. LeetCode:Binary Tree Level Order Traversal I II

    LeetCode:Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of ...

  7. 【Binary Tree Level Order Traversal II 】cpp

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  8. lettcode-102:Binary Tree Level Order Traversal (Java)

    Binary Tree Level Order Traversal 二叉树的层序遍历 两种方式: 1.用两个queue交替表示每一层的节点 2.用两个node,一个表示当前层的最后一个节点,一个表示下 ...

  9. leecode 每日解题思路 102-Binary Tree Level Order Traversal

    題目描述: 题目链接: 102-Binary Tree Level Order Traversal 这个问题要解决的是如何逐层遍历一个二叉树,并把同一层元素放入同一list中, 再将所有元素返回. 其 ...

随机推荐

  1. 安卓高级8 SurfaceView (1)

    文章转载:http://www.cnblogs.com/xuling/archive/2011/06/06/android.html 首先我们先来看下官方API对SurfaceView的介绍 Surf ...

  2. 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文

    NMF(非负矩阵分解),由于其分解出的矩阵是非负的,在一些实际问题中具有非常好的解释,因此用途很广.在此,我给大家介绍一下NMF在多声部音乐中的应用.要翻译的论文是利用NMF转录多声部音乐的开山之作, ...

  3. 集群技术(三)MySQL集群深度解析

    什么是MySQL集群 MySQL集群是一个无共享的(shared-nothing).分布式节点架构的存储方案,其目的是提供容错性和高性能. 数据更新使用读已提交隔离级别(read-committedi ...

  4. Swift类型推测在可选调用中的小提示

    我们知道Swift中协议里也有对应于Objc中的可选方法或计算属性,当然协议必须以@objc伪指令修饰否则不可以哦. 如下示例: @objc protocol Transaction{ fun com ...

  5. Objective-C基础之简析深浅copy

    一.从面向对象到Objective-C概览copy 1.面向对象: In object-oriented programming, object copying is creating a copy ...

  6. 安卓自定义日期控件(仿QQ,IOS7)

    还记得上篇:高大上的安卓日期时间选择器,本篇是根据上篇修改而来,先看下qq中日期选择的效果: 鉴于目前还没有相似的开源日期控件,因此本人花费了一些时间修改了下之前的日期控件,效果如图: 虽说相似度不是 ...

  7. 皮尔森相似度计算举例(R语言)

    整理了一下最近对协同过滤推荐算法中的皮尔森相似度计算,顺带学习了下R语言的简单使用,也复习了概率统计知识. 一.概率论和统计学概念复习 1)期望值(Expected Value) 因为这里每个数都是等 ...

  8. javascript之事件处理

    一般事件 onclick                       鼠标点击时触发此事件 ondblclick                  鼠标双击时触发此事件 onmousedown    ...

  9. Android简易实战教程--第十三话《短信备份和还原~三》

    之前写过短信备份的小案例,哪里仅仅是虚拟了几条短信信息.本篇封装一个业务类,且直接通过内容提供者,访问本系统的短信信息,再提供对外接口.如果想要短信备份和短信还原,直接复制这段代码即可.对于您调用这个 ...

  10. GCD API 记录 (三)

    本篇就不废话啦,接着上篇记录我见过或者使用过的与GCD相关的API.由于一些API使用的非常少,用过之后难免会忘记,还是记录一下比较好. 6.dispatch_group_wait 该API依然是与d ...