「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
从上到下打印二叉树 III
题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
节点总数 <= 1000
题目分析
这道题目同样也是考察二叉树的层序遍历,但需要考虑二叉树层的奇偶性,奇数从左到右遍历,偶数从右到左遍历。这里我们考虑使用双端队列来完成,奇数层添加到双端队列的尾部,偶数层添加到双端队列的头部。
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
if (root != null) {
queue.add(root);
}
while (!queue.isEmpty()) {
LinkedList<Integer> temp = new LinkedList<>();
for (int i = queue.size(); i>0; i--) {
TreeNode treeNode = queue.poll();
if (result.size()%2 ==0) {
temp.addLast(treeNode.val);
} else {
temp.addFirst(treeNode.val);
}
if (treeNode.left!=null) {
queue.add(treeNode.left);
}
if (treeNode.right!=null) {
queue.add(treeNode.right);
}
}
result.add(temp);
}
return result;
}
}
这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉二叉树的层序优先遍历的操作。
其中
if (result.size()%2 ==0) {
temp.addLast(treeNode.val);
} else {
temp.addFirst(treeNode.val);
}
这段代码就是利用双端队列的特性,奇数从头部插插入,偶数从尾部添加。而我们知道,LinkedList的数据结构就是一个双向链表的数据结构
总结
这篇文章同样也是解决了二叉树的层序遍历,同时利用了LinkedList这个双向链表的数据结构,关于二叉树遍历的题目千奇百怪,五花八门,我们在合适的场景选择合适的数据结构来解决问题才是硬道理。
如果有不当之处,欢迎指正。