剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出
剑指 Offer 32 - III. 从上到下打印二叉树 III
Offer_32_3
题目详情
题解分析
本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Collections工具类的reverse函数来实现。
这里我根据偶数层和奇数层改变了遍历的顺序,相对较复杂。
package com.walegarrett.offer;
import java.util.*;
/**
* @Author WaleGarrett
* @Date 2021/2/1 15:53
*/
/**
* 题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,
* 第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
*/
public class Offer_32_3 {
public ListListInteger levelOrder(TreeNode root) {
if(root == null)
return new ArrayList();
ListListInteger list = new ArrayList();
DequeTreeNode que = new LinkedList();
que.add(root);
boolean isOdd = true;//是否是奇数
while(!que.isEmpty()){
ListInteger current = new ArrayList();
StackTreeNode sta = new Stack();
for(int i = que.size(); i 0; i--){
TreeNode temp = que.peek();
que.poll();
current.add(temp.val);
if(isOdd){
if(temp.left != null) {
sta.add(temp.left);
}
if(temp.right != null) {
sta.add(temp.right);
}
}else{
if(temp.right != null) {
sta.add(temp.right);
}
if(temp.left != null) {
sta.add(temp.left);
}
}
}
while(!sta.empty()){
que.add(sta.pop());
}
list.add(current);
isOdd = !isOdd;//反转遍历方向
}
return list;
}
}
```java
剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出 相关文章
剑指 Offer 32 - II. 从上到下打印二叉树 II + 层次遍历二叉树 + 按层存储
剑指 Offer 32 - II. 从上到下打印二叉树 II Offer_32 题目描述: 题解分析: 这道题我一开始想到的解决方法较粗暴,就是使用两个变量来记录当前层的节点数和下一层的结点数。 以上的方法虽然可行,但是较复杂。实际每次队列里存储的就是当前层的所有结点,
剑指 Offer 32 - I. 从上到下打印二叉树 + 层次遍历二叉树
剑指 Offer 32 - I. 从上到下打印二叉树 Offer_32_1 题目描述 解题思路 这题属于简单题,考察的是我们对二叉树以及层次遍历的方法。 这里只需要使用简单的队列即可完成二叉树的层次遍历。 此外,由于这道题需要返回一个定长数组,但是我一时没有找到合适的将
leetcode-剑指43-OK
// language c// 剑指43// https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/int countDigitOne(int n){ if(n==0) return 0; if(n10) return 1;int GetWeishu(int n){int count = 0;while(n0){count++;n /=10;}return count;}i
LeetCode-剑指 Offer 二叉搜索树与双向链表
题目链接 题意 将一棵二叉搜索树的结点按照从小到大的顺序构建成一个双向链表,要求不能创建新的节点。 思路 首先很容易想到对二叉树的中序遍历可以得到升序的结点序列。 其次,维护一个头结点head,和一个始终指向当前最后一个结点的prev。 因此每在第一步
剑指offer-13 机器人运动范围
剑指offer-13 机器人运动范围 广度优先BFS 只用向下或向右 [0, 0]先入队列, 当队列不为空,shift出一个坐标。如果当前坐标满足条件,则将左右节点入队列,同时标记该节点,同时结果+1;若不满足条件,则什么都不做,跳过这轮循环。 其实跟树的遍历差不多嘛
剑指offer12 矩阵中的路径
剑指offer12 矩阵中的路径 深度优先搜索(DFS)+剪枝 DFS解析: 递归参数:矩阵行列索引 i 和 j ,目标字符在 word 中 索引 k 终止条件: 行列索引越界 当前矩阵字符与目标字符不符合(包含已访问的情况 成功条件: k = word.length - 1 递推工作: 标记当前
剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题
剑指 Offer 31. 栈的压入、弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作。 package com.walegarrett.offer;/** * @Author WaleGarrett * @Date 2021/1/31 14:12 */import java.util.Arrays;import java.util.Stack;/** * 题目描述
剑指 Offer 30. 包含min函数的栈 + 双栈实现求解栈中的最小值
剑指 Offer 30. 包含min函数的栈 Offer_30 题目描述: 题解分析: 题目其实考察的是栈的知识,本题的目的是使用两个栈来求解最小值。 第二个栈主要用来维护第一个栈中的最小值,所以它里面的值都是有序的,值最小的放在栈顶。 此外,第二个栈出栈的处理有点
剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题
剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一个方向遍历时,除非遇到改变方向的情况,否则一直走下去。 需要注意
剑指 Offer 47. 礼物的最大价值 dp
地址https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/ 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。 给