本文是在学习中的总结,欢迎转载但请注明出处: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},

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

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

思路:

(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)希望本文对你有所帮助。谢谢。

算法代码实现如下所示:

public static List<List<Integer>> levelOrder(TreeNode root) {
	List<List<Integer>> result = new LinkedList<List<Integer>>();
	//注意root为空时不能返回null
	if (root == null)
		return result;

	List<TreeNode> all = new LinkedList<TreeNode>();
	all.add(root);
	int first = 0; //当前待访问节点,初始为第一个节点,即根节点
	int last = 1; //当前链表中元素个数,初始只有一个
	while (first < all.size()) {  //如果待访问节点存在于链表
		last = all.size();      //下一行访问开始,定位last为当前行最后一个节点下一个节点所在位置
		List<Integer> level = new LinkedList<Integer>();
		while (first < last) {    //如果first==last表示该行所有节点都被访问到了,跳出循环
			level.add(all.get(first).val);
			if (all.get(first).left != null) {
				all.add(all.get(first).left);
			}
			if (all.get(first).right != null) {
				all.add(all.get(first).right);
			}
			first++; //每访问完一个节点就指向下一个节点
		}
		result.add(level);
	}
	return result;
}

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. 关于html+ashx开发中几个问题的解决方法的感想和总结

    1.针对上篇文章中的服务端处理不敢苟同.仍然坚持使用反射,建立BaseHandler.ashx并在默认process方法中写上反射方法以及权限验证方法.针对具体的情况返回对应的值.服务端其他handl ...

  2. 重置winsock目录解决不能上网的问题

    摘自:http://www.52microsoft.com/netsh-winsock-reset/ 有时候,我们会遇到能成功连接网络但是却无法上网的问题.屏幕右下角系统托盘中的网络连接图标显示正常, ...

  3. PHP 字符串变量

    PHP 字符串变量 字符串变量用于存储并处理文本. PHP 中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量 ...

  4. Docker控制组

    控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制. 它提供了很多有用的特性:以及确保各个容器可以公平地分享主机的内存.CPU.磁盘 IO 等资源:当然,更重要的是,控制组确保 ...

  5. Jeff Atwood倾情推荐——程序员必读之书

    英文版:<Code Complete 2>中文版:<代码大全(第二版)>作者:Steve McConnell译者:金戈  汤凌  陈硕  张菲出版社:电子工业出版社出版日期:2 ...

  6. 【SSH系列】Hibernate映射 -- 多对多关联映射

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

  7. ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation

    ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...

  8. 信用卡3D验证相关资料

    3D 验证服务,是银行与VISA .MASTERCARD国际组织联合推出的为保障银行维萨及万事达信用卡持卡客户网上交易安全,防范网上伪冒交易的一项信用卡网上支付安全验证服务( 维萨卡使用的验证服务叫& ...

  9. x264源代码简单分析:编码器主干部分-2

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  10. ViewPager 几个状态详解

    ViewPager.SCROLL_STATE_DRAGGING 当用户按下ViewPager视图并且需要滑动第一下时; ViewPager.SCROLL_STATE_SETTLING: 当用户滑动的放 ...