[LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III相关的知识,希望对你有一定的参考价值。
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如: 给定二叉树: [3,9,20,null,null,15,7],
3
/ \\
9 20
/ \\
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
- 节点总数 <= 1000
题解一:
层序遍历 + 双端队列:利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:
- 奇数层则添加至 tmp 尾部
- 偶数层则添加至 tmp 头部
/**
* 剑指 Offer 32 - III. 从上到下打印二叉树 III
*/
public List<List<Integer>> levelOrder(TreeNode root)
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if (root != null)
queue.offer(root);
while (!queue.isEmpty())
// 临时集合,存储当前层的遍历结果
LinkedList<Integer> tmp = new LinkedList<>();
// 遍历当前层的所有节点
for (int i = queue.size(); i > 0; i--)
TreeNode node = queue.poll();
// 偶数层,从右往左打印
if (res.size() % 2 == 0)
tmp.addLast(node.val);
else
// 奇数层,从左往右打印
tmp.addFirst(node.val);
// 将其左、右孩子加入到队列尾
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
res.add(tmp);
return res;
题解二:
/**
* 剑指 Offer 32 - III. 从上到下打印二叉树 III
*/
public List<List<Integer>> levelOrder(TreeNode root)
List<List<Integer>> res = new ArrayList<>();
// 双端队列
Deque<TreeNode> deque = new LinkedList<>();
if (root != null)
deque.add(root);
while (!deque.isEmpty())
List<Integer> tmp = new ArrayList<>();
// 从左至右打印奇数层所有结点
for (int i = deque.size(); i > 0; i--)
TreeNode node = deque.removeFirst();
tmp.add(node.val);
// 从左至右加入下层结点
if (node.left != null)
deque.addLast(node.left);
if (node.right != null)
deque.addLast(node.right);
res.add(tmp);
// 为空则提前结束
if (deque.isEmpty())
break;
tmp = new ArrayList<>();
// 从右往左打印偶数层所有结点
for (int i = deque.size(); i > 0; i--)
TreeNode node = deque.removeLast();
tmp.add(node.val);
// 从右往左加入下层结点
if (node.right != null)
deque.addFirst(node.right);
if (node.left != null)
deque.addFirst(node.left);
res.add(tmp);
return res;
题解三:
/**
* 剑指 Offer 32 - III. 从上到下打印二叉树 III
*/
public List<List<Integer>> levelOrder(TreeNode root)
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if (root != null)
queue.add(root);
while (!queue.isEmpty())
List<Integer> tmp = new ArrayList<>();
for (int i = queue.size(); i > 0; i--)
TreeNode node = queue.poll();
tmp.add(node.val);
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
// 偶数层反转列表元素顺序
if (res.size() % 2 == 1)
Collections.reverse(tmp);
res.add(tmp);
return res;
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof
以上是关于[LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 剑指Offer 15[位运算] 二进制中1的个数 HERODING的LeetCode之路
LeetCode1482. 制作 m 束花所需的最少天数 / 剑指 Offer 32 . 从上到下打印二叉树I/II/III