本文是在学习中的总结,欢迎转载但请注明出处: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. pentaho cde 自定义复选下拉框 checkbox select

    pentaho  自带的component 虽多,但是当用户需要在一个表格中查看多个组别的数据时,pentaho自带的单选框就不能实现了,所以复选下拉框势在必行,实现效果如下: 实现原理是借用了jqu ...

  2. C++重载输入流复习

    C++重载输入流 #include <bits/stdc++.h> using namespace std; struct Point { int x, y; Point(int xx, ...

  3. ACM Secrete Master Plan

    Problem Description Master Mind KongMing gave Fei Zhang a secrete master plan stashed in a pocket. T ...

  4. zabbix API基本使用方法介绍

    前言: 以下内容根据zabbix 3.2官方文档总结:https://www.zabbix.com/documentation/3.2/manual/api 此文档只是简单的介绍API的基本使用,关于 ...

  5. unix下快速混淆源代码

    只能算雕虫小技,但可以快速简单的做混淆,如下: #vapyhqr <fgqvb.u> #vapyhqr <fgqyvo.u> #vapyhqr <fgqobby.u> ...

  6. scala学习笔记4(apply方法)

    class ApplyTest{ def apply() = "This apply is in class" def test{ println("test" ...

  7. Dynamics CRM 注册插件dll到GAC

    以server2012为例,搜索cmd,打开红框中的命令框,gacutil.exe -i "dll路径" 通过该命令把需要用到dll注册进gac(这里包括你的插件dll和你插件中引 ...

  8. Oracle采购模块中的多组织访问控制(MOAC)

     1. 概述 从Release12开始启用多组织访问控制功能,将允许用户在一个单独的职责中访问一个或者多个经营单位(OU-Operation Units)的数据.这个功能允许用户在一个可共享服务的 ...

  9. 03 EditText文本编辑框

    二  EditText   文本编辑框  父类: TextView     >概念:文本编辑框  可以进行文本编辑         android:textColor="#00f&qu ...

  10. 听说你又一次放弃了Dagger2,来听老夫说道说道

    关于Dagger2是啥,用法网上已经有很多了.不过听说你已经很多次Dagger2从入门到放弃了,来来,让我这个老中医给你治一治.老夫手法纯熟,不会让你有任何痛苦的,放心读下去吧. 本文同步自 博主的私 ...