【leetcode刷题笔记】Binary Tree Level Order Traversal(JAVA)
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)的更多相关文章
- [刷题] 102 Binary Tree Level Order Traversal
要求 对二叉树进行层序遍历 实现 返回结果为双重向量,对应树的每层元素 队列的每个元素是一个pair对,存树节点和其所在的层信息 1 Definition for a binary tree node ...
- 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 ...
- 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 ...
- lettcode-102:Binary Tree Level Order Traversal (Java)
Binary Tree Level Order Traversal 二叉树的层序遍历 两种方式: 1.用两个queue交替表示每一层的节点 2.用两个node,一个表示当前层的最后一个节点,一个表示下 ...
- 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, ...
- 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 ...
- [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 ...
- 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 ...
- Binary Tree Level Order Traversal java实现
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
随机推荐
- 【整理】mysql中information_schema.tables字段说明
[整理]mysql中information_schema.tables字段说明 2016-05-04 16:47:50| 分类: 默认分类|举报|字号 订阅 下载LOFTER我的照片书 | ...
- docker pull net/http: TLS handshake timeout错误解决
docker pull net/http: TLS handshake timeout 出现这个错误,原因很明显,我们在围城里,有两种解决办法,一种是用梯子爬围墙,一种是用国内源,下面用国内源 e ...
- centos自动安装镜像脚本
#!/bin/bash ######################################################################################## ...
- Windows2008RC2 IIS配置php执行环境
1:下载一个php manager,安装.打开IIS管理器后,点击计算机,就能够看到右边PHPManager 静静地躺在那儿了.双击PHPManager 后我们就能够開始对PHP进行配置了. 2 ...
- Spring4整合Hibernate5时不能自动生成表结构
© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: Spring4整合Hibernate5时,不再使用hibernate.cfg.xml,将其内容整合到Spring配置文件中,启动后不能 ...
- spark-submit 提交任务
将工程打成jar 放入到linux中 切换到[root@node4 Desktop]# cd /usr/local/development/spark-2.0-hadoop2.6/bin/ 输入命令 ...
- Java中HashTable和HashMap的区别
在Java中,HashTable和HashMap都是哈希表,那么它们有什么区别呢? 1.它们所继承的类不一样. HashTable和HashMap都实现了Map接口,但是它们所继承的类时不同的.H ...
- iOS 解决TableView reloadData时cell中图片会闪的问题
tableView调用reloaddata的时候发现有个小问题,每次刷新图片都会抖动闪烁一下,看着很难受,也影响体验.造成这个问题的主要原因是因为刷新时候切换图片导致.要解决这个问题也很好解决,使用S ...
- hibernate双向一对多映射
双向多对一 :Customer类------------>一的一端 Order类----------->多的一端 Customer类:(省略set().get()和构造方法) priv ...
- prometheus监控方案
简介 prometheus 是一个开源的系统监控和告警的工具包,其采用pull方式采集时间序列,通过http协议传输. 架构 每个应用都通过javaagent向外提供一个http服务暴露出自己的JMX ...