题目地址(32 - III. 从上到下打印二叉树 III)
https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
题目描述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7返回其层次遍历结果:[[3],[20,9],[15,7]]提示:节点总数 <= 1000
前置知识
公司
- 暂无
思路
二叉树的层序遍历的基础上完成这道题 有两个方法 其中判断是不是偶数层就使用返回值数组的size判断
- 先将数据加入temp 然后在奇数层翻转数组
- temp由ArrayList改成linkedlist 双向链表 在每次向temp添加值的时候 先判断奇数层还是偶数层 奇数层就每次都把数据加到temp前面 偶数层相反
关键点
代码
- 语言支持:Java
Java Code:
方法1
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {ArrayList<List<Integer>> res = new ArrayList<>();LinkedList<TreeNode> queue = new LinkedList<>();if (root == null) {return res;}queue.add(root);while (!queue.isEmpty()) {ArrayList<Integer> temp = new ArrayList<>();int size = queue.size();while (size > 0) {TreeNode poll = queue.poll();temp.add(poll.val);if (poll.left != null) {queue.add(poll.left);}if (poll.right != null) {queue.add(poll.right);}size--;}if (res.size() % 2 != 0) {Collections.reverse(temp);}res.add(temp);}return res;}}
方法2
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {ArrayList<List<Integer>> res = new ArrayList<>();LinkedList<TreeNode> queue = new LinkedList<>();if (root == null) {return res;}queue.add(root);while (!queue.isEmpty()) {LinkedList<Integer> temp = new LinkedList<>();int size = queue.size();while (size > 0) {TreeNode poll = queue.poll();if (res.size() % 2 == 0) {temp.add(poll.val);}else {temp.addFirst(poll.val);}if (poll.left != null) {queue.add(poll.left);}if (poll.right != null) {queue.add(poll.right);}size--;}res.add(temp);}return res;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=GnnZD)
- 空间复杂度:
#card=math&code=O%28n%29&id=toPbc)
