【leetcode-102,107,103】 二叉树的层次遍历
102. 二叉树的层次遍历
(1过,隐蔽错误花时间很多,简单题目本应很快,下次注意红色错误的地方)
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
public static ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(queue.size() > 0) {
ArrayList<Integer> list = new ArrayList<>();
int size = queue.size();
// 之前写成了for (int i=0;i<queue.size();i++),而for循环内会让queue的size变化,很隐蔽的错误。应该先把size固定下来
for (int i=0;i<size;i++) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
}
res.add(list);
}
return res;
}
107. 二叉树的层次遍历 II
(1过,就是一个列表反转,没练习意义)
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(queue.size() > 0) {
ArrayList<Integer> list = new ArrayList<>();
int size = queue.size();
// 之前写成了for (int i=0;i<queue.size();i++),而for循环内会让queue的size变化,很隐蔽的错误。应该先把size固定下来
for (int i=0;i<size;i++) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
}
res.add(list);
}
return reverse(res);
}
public ArrayList<ArrayList<Integer>> reverse(ArrayList<ArrayList<Integer>> list) {
for (int i=0;i<list.size()/2;i++) {
ArrayList<Integer> temp = list.get(i);
list.set(i,list.get(list.size()-1-i));
list.set(list.size()-1-i,temp);
}
return list;
}
103. 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
] 这种变化也简单,下面参考代码的优点:
1.list.add(0, node.val)方法,list头部插入
2.栈的思想 链接:https://www.nowcoder.com/questionTerminal/47e1687126fa461e8a3aff8632aa5559
来源:牛客网
/**
*
* @author Jacob
* 103. Binary Tree Zigzag Level Order Traversal
*
* 两种解法:1.使用两个堆栈;2.使用一个queue,用flag记录当前行打印顺序
*/
public class Demo2 {
/*
* 方法一 解法与Binary Tree Level Order Traversal一致 区别是需要用一个flag判断应该正序or逆序打印
*/
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (root == null)
return res;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
// 用flag控制正序或者逆序打印
boolean flag = true;
while (!queue.isEmpty()) {
int size = queue.size();
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (flag)
list.add(node.val);
else
list.add(0, node.val);
if (node.left != null)
queue.offer(node.left);
if (node.right != null)
queue.offer(node.right);
}
flag = !flag;
res.add(list);
}
return res;
}
/*
* 解法二 使用两个堆栈
*/
public List<List<Integer>> zigzagLevelOrder_2(TreeNode root) {
TreeNode c = root;
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if (c == null)
return ans;
Stack<TreeNode> s1 = new Stack<TreeNode>();
Stack<TreeNode> s2 = new Stack<TreeNode>();
s1.push(root);
while (!s1.isEmpty() || !s2.isEmpty()) {
List<Integer> tmp = new ArrayList<Integer>();
while (!s1.isEmpty()) {
c = s1.pop();
tmp.add(c.val);
if (c.left != null)
s2.push(c.left);
if (c.right != null)
s2.push(c.right);
}
ans.add(tmp);
tmp = new ArrayList<Integer>();
while (!s2.isEmpty()) {
c = s2.pop();
tmp.add(c.val);
if (c.right != null)
s1.push(c.right);
if (c.left != null)
s1.push(c.left);
}
if (!tmp.isEmpty())
ans.add(tmp);
}
return ans;
}
private class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}
【leetcode-102,107,103】 二叉树的层次遍历的更多相关文章
- LeetCode(102):二叉树的层次遍历
Medium! 题目描述: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 ...
- leetcode 102. 二叉树的层次遍历 及 103. 二叉树的锯齿形层次遍历
102. 二叉树的层次遍历 题目描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / ...
- LeetCode 107 ——二叉树的层次遍历 II
1. 题目 2. 解答 与 LeetCode 102 --二叉树的层次遍历 类似,我们只需要将每一层的数据倒序输出即可. 定义一个存放树中数据的向量 data,一个存放树的每一层数据的向量 level ...
- LeetCode:二叉树的层次遍历||【107】
LeetCode:二叉树的层次遍历||[107] 题目描述 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,2 ...
- LeetCode 102. 二叉树的层次遍历(Binary Tree Level Order Traversal) 8
102. 二叉树的层次遍历 102. Binary Tree Level Order Traversal 题目描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 每 ...
- Java实现 LeetCode 107 二叉树的层次遍历 II(二)
107. 二叉树的层次遍历 II 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null, ...
- Java实现 LeetCode 102 二叉树的层次遍历
102. 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 2 ...
- LeetCode 102. Binary Tree Level Order Traversal 二叉树的层次遍历 C++
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- Leetcode 102 二叉树的层次遍历 Python
二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 ...
随机推荐
- 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)
[BZOJ5335][TJOI2018]智力竞赛(二分图匹配) 题面 BZOJ 洛谷 题解 假装图不是一个DAG想了半天,.发现并不会做. 于是假装图是一个DAG. 那么显然就是二分答案,然后求一个最 ...
- 一种使用 emwin 绘制图片的方法
@2018-12-10 [小记] 使用官方 <GUIBuilder.exe> 软件里的 Image 控件,注意格式为 .bmp,这种方式是将图片数据直接转为十六进制数据存储至静态区 具体使 ...
- 洛谷 P3121 【[USACO15FEB]审查(黄金)Censoring (Gold)】
被自己学校OJ的毒瘤测评姬卡到自闭 Hash+栈+优化暴力 其实思路也很简单,就是把单词存进一个结构体,记录其哈希值和长度,然后就可以开始匹配了 但是,理论复杂度很高,为\(O(n*length)\) ...
- BZOJ 1854: [Scoi2010]游戏(二分图匹配/并查集)
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 题解: 1.二分图匹配: 首先我们发现每件装备只能在两种属性中选一种.因此,我们以每 ...
- 使用 MongoDB 存储日志数据
使用 MongoDB 存储日志数据 线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题 ...
- tyvj/joyoi 1340 送礼物
论搜索顺序的优越性. 从小到大搜索,T到怀疑人生. 从大到小搜索,轻松AC. 双向搜索. 是这样的.我们首先排序一下,然后翻转.(当然也可以写cmp) 然后我们搜前半部分,把结果记录在某一数组中. 然 ...
- [bzoj1563][诗人小g]
bzoj1563 思路 首先考虑\(n^2\)的暴力dp,用sum[i]表示前i句话的长度总和.f[i]表示前i句话最小的不协调度之和.转移的时候考虑枚举前面的每个点,找到转移的最优秀的那个点. 然后 ...
- 【洛谷P1060 开心的金明】
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行”. ...
- python 二维数组读入
study from : https://www.cnblogs.com/reaptomorrow-flydream/p/9613847.html python 二维数组键盘输入 1 m = int( ...
- c#中序列化和反序列化的理解
using System.IO;using System.Runtime.Serialization.Formatters.Binary; 序列化:对象转化为文件的过程(字节流) 反序列化:文件(字节 ...