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},

   / \

    /  \
      

return its level order traversal as:

[
[],
[,],
[,]
]

题解:二叉树的层次遍历,用队列实现。重点在于如何判断每一层的结束和下一层的开始。

用一个变量nextLevelStarter记录下一层的开始节点,最初为root的左子或者右子(如果左子为空),每一层遍历开始的时候赋值为null。在遍历这一层时,观察当前遍历节点的左子和右子,如果nextLevelStarter当前为空,且当前节点的左子不为空,那么说明当前节点的左子是下一层的第一个节点,就把当前节点的左子赋值给nextLevelStarter;如果左子为空,再看右子。如果当前节点的左右子都为空,那么nextLevelStarter应该是当前节点这一层后面的节点的孩子,就继续遍历当前这一层。以上面的例子说明,遍历第二层时从9开始,发现9的左子和右子都为空,那么nextLevelStarter就保持为null,遍历到20的时候,发现20的左子不为空,那么就把nextLevelStarter赋值为20的左子,即下一层的第一个节点。这时候nextLevelStarter已经不为空了,那么即使20后面还有节点,也不会改变nextLevelStarter的值了。

代码如下:

 public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> answerList = new ArrayList<List<Integer>>();
TreeNode nextLevelStarter;
Queue<TreeNode> q = new LinkedList<TreeNode>(); q.add(root);
if(root != null){
if(root.left != null)
nextLevelStarter = root.left;
else if(root.right != null)
nextLevelStarter = root.right;
else {
List<Integer> temp = new ArrayList<Integer>();
temp.add(root.val);
answerList.add(temp);
return answerList;
}
}
else
return answerList; while(!q.isEmpty()){ TreeNode currentNode = q.peek();
List<Integer> thisLevelList = new ArrayList<Integer>();
//每层遍历开始的时候把nextLevelStarter赋值为null,遍历这一层的时候顺便找下一层的开始节点
nextLevelStarter = null; //没有到达下一层的开始节点时继续遍历
while(q.peek() != nextLevelStarter && q.isEmpty() == false){
currentNode = q.remove(); //如果nextLevelStarter值为空,说明还没找到下一层的起始节点
//那么就查看当前遍历的节点的孩子是否为空,不为空就是下一层的起始节点
if(nextLevelStarter == null){
if(currentNode.left != null)
nextLevelStarter = currentNode.left;
else {
if(currentNode.right != null){
nextLevelStarter = currentNode.right;
}
}
} thisLevelList.add(currentNode.val);
if(currentNode.left != null)
q.add(currentNode.left);
if(currentNode.right != null)
q.add(currentNode.right);
} answerList.add(thisLevelList);
}
return answerList;
}
}

还要积累一下java中队列的使用方法:

1.声明和初始化:

Queue<TreeNode> q = new LinkedList<TreeNode>();

2.add()函数:往队列中加入一个值

3.peek()函数:返回队列头但不删除队列头

4.remove()函数:返回队列头并且删除队列头

java中声明二维列表的方法:

List<List<Integer>> answerList = new ArrayList<List<Integer>>();

做这道题的时候还遇到一个问题,就是开始时候想在每一层结束后把存放当前层节点信息的列表thisLevelList加入到answerList这个二维列表后就把thisLevelList清空,就不用在每层开始遍历的时候都要声明thisLevelList了,后来发现这种方法不可行,因为把thisLevelList清空后answerList里面加入的thisLevelList的值也没有了,想了一下原因应该是每次声明thisLevelList的时候都开辟了一块内存,当把thisLevelList加入answerList的时候,answerList直接设置一个指针指向这块内存,所以如果把这块内存清空,answerList里面指向的值就对应请空了。所以在遍历每一层的时候都要申请新的内存空间存放当前这一层节点的值。

说好半个小时写完的,高估自己了,碎觉~

【leetcode刷题笔记】Binary Tree Level Order Traversal(JAVA)的更多相关文章

  1. [刷题] 102 Binary Tree Level Order Traversal

    要求 对二叉树进行层序遍历 实现 返回结果为双重向量,对应树的每层元素 队列的每个元素是一个pair对,存树节点和其所在的层信息 1 Definition for a binary tree node ...

  2. LeetCode(107) Binary Tree Level Order Traversal II

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

  3. LeetCode之“树”:Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal 题目链接 题目要求: Given a binary tree, return the level order traversal o ...

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

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

  5. leetcode 102 Binary Tree Level Order Traversal ----- java

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

  6. LeetCode(26)-Binary Tree Level Order Traversal II

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

  7. [LeetCode&Python] Problem 107. Binary Tree Level Order Traversal II

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

  8. LeetCode(102) Binary Tree Level Order Traversal

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

  9. Binary Tree Level Order Traversal java实现

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

随机推荐

  1. Linux常见服务器——DHCP服务器的搭建

    一.基础知识: 1.DHCP简介: DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP ...

  2. App功能测试的7大注意点

    转载于:https://mp.weixin.qq.com/s/27DZ1EQVpl-gb4S7n-He4g 01 运行 1)App安装完成后的试运行,可正常打开软件. 2)App打开测试,是否有加载状 ...

  3. 深入理解dp px density

    1 http://blog.csdn.net/lcaihy1314/article/details/8446401 2 待续

  4. js识别不同浏览器

    检測浏览器.注意浏览器推断顺序,主要是基于userAgent做推断. //检測浏览器 var client = function(){     var engine = {         ie:0, ...

  5. Heterogeneity Wins

     Heterogeneity Wins Edward Garson THE nATuRAl EvoluTion oF CoMpuTER TECHnology has brought about im ...

  6. entity framework core 调用存储过程和方法

    目前EF Core调用存储过程,限制很多,比如返回结果必须是定义好的DbSet<>等等.这里用一种曲线救国的方式,自定义两个方法,用原始ado.net解决问题.以MySql数据库为例,代码 ...

  7. 出现windows启动服务失败(无法从命令行或调试器启动,需要安装InstallUtil.exe)的解决办法

    两种方法1 从命令行安装2 选择项目-视图-自定义操作   然后将 安装,提交,回滚,卸载分别加入自定义操作,注意InstallClass属性为true

  8. windows 10右键项添加Notepad++

    1.打开注册表编辑器,开始->运行->regedit. 2.在HKEY_CLASSSES_ROOT→ * → Shell 下,在Shell下,新建项命名为Open With Notepad ...

  9. 【Python + Selenium】之JS定位总结

    感谢:小琰子 Python+Selenium 脚本中的一些js的用法汇总: 1.滚动条 driver.set_window_size(500,500) js = "window.scroll ...

  10. 文本信息检索——布尔模型和TF-IDF模型

    文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 ​ 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...