二叉树的锯齿形层序遍历

题目描述:给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:利用队列和栈遍历二叉树

队列的特点是先进先出,栈的特点是后进先出,所以利用队列和栈来遍历二叉树实现锯齿形遍历,具体过程如下:

  • 首先,如果root为空,直接返回空的List。
  • 如果root不为空,声明一个队列nodes,将root节点加入到队列中,声明一个result,声明一个boolean类型的变量directionFlag,当directionFlag为true时,从左往右往栈中放入节点;当directionFlag为false时,从右往左放入节点,然后遍历nodes中的节点,遍历过程如下:
    • 首先,用count记录当前队列中节点的数量,即为当前层节点的数量,vals记录当前节点的值,声明一个栈temp;
    • 从nodes中按顺序取出count个节点,并且将相应的节点值放入vals中,同时如果当前节点的左右子节点不为空,根据directionFlag判断是按从左到右的顺序还是从右往左的顺序放入temp中。然后将vals加入到结果result中。
    • 将栈temp中的元素全部取出放入nodes。
  • 重复遍历nodes中的节点,直到nodes为空。
  • 最后返回result即为锯齿形层序遍历的结果。

说明:解决方法类似 LeetCode-102-二叉树的层序遍历

import java.util.*;

public class LeetCode_103 {
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> result = new ArrayList<>();
Queue<TreeNode> nodes = new LinkedList<>();
nodes.add(root);
// 当directionFlag为true时,从左往右放入节点;当directionFlag为false时,从右往左放入节点
boolean directionFlag = true;
while (!nodes.isEmpty()) {
int count = nodes.size();
List<Integer> vals = new ArrayList<>();
Stack<TreeNode> temp = new Stack<>();
while (count > 0) {
TreeNode curNode = nodes.poll();
vals.add(curNode.val);
if (!directionFlag) {
if (curNode.right != null) {
temp.push(curNode.right);
}
if (curNode.left != null) {
temp.push(curNode.left);
}
} else {
if (curNode.left != null) {
temp.push(curNode.left);
}
if (curNode.right != null) {
temp.push(curNode.right);
}
}
count--;
}
// 将栈中的节点取出放入队列中
while (!temp.isEmpty()) {
nodes.add(temp.pop());
}
// 每一层遍历后变更顺序
directionFlag = !directionFlag;
result.add(vals);
}
return result;
} public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.right.right = new TreeNode(5); for (List<Integer> integers : zigzagLevelOrder(root)) {
for (Integer integer : integers) {
System.out.print(integer + " ");
}
System.out.println();
}
}
}

【每日寄语】 学习的敌人是自己的满足,要认真学习一点东西,必须从不自满开始!

LeetCode-103-二叉树的锯齿形层序遍历的更多相关文章

  1. LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

    103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...

  2. Java实现 LeetCode 103 二叉树的锯齿形层次遍历

    103. 二叉树的锯齿形层次遍历 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null ...

  3. [LeetCode] 103. 二叉树的锯齿形层次遍历

    题目链接 : https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/ 题目描述: 给定一个二叉树,返回其节 ...

  4. leetcode 103二叉树的锯齿形层次遍历

    与102相比就增加了flag,用以确定要不要进行reverse操作 reverse:STL公共函数,对于一个有序容器的元素reverse ( s.begin(),s.end() )可以使得容器s的元素 ...

  5. LeetCode 103——二叉树的锯齿形层次遍历

    1. 题目 2. 解答 定义两个栈 s_l_r.s_r_l 分别负责从左到右和从右到左遍历某一层的节点,用标志变量 flag 来控制具体情况,根节点所在层 flag=1 表示从左到右遍历,每隔一层改变 ...

  6. LeetCode:二叉树的锯齿形层次遍历【103】

    LeetCode:二叉树的锯齿形层次遍历[103] 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 ...

  7. leetcode 102. 二叉树的层次遍历 及 103. 二叉树的锯齿形层次遍历

    102. 二叉树的层次遍历 题目描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / ...

  8. 【LeetCode】103# 二叉树的锯齿形层次遍历

    题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], ...

  9. 【二叉树-BFS系列1】二叉树的右视图、二叉树的锯齿形层次遍历

    题目 199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, ...

  10. LeetCode103. 二叉树的锯齿形层次遍历

    103. 二叉树的锯齿形层次遍历 描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 示例 例如,给定二叉树: [3,9,2 ...

随机推荐

  1. 「SDWC2018 Day1」网格

    题目当中有三条限制,我们来逐一考虑.对于第一条限制,每次走动的增加量 \(x_i \le M_x, y_i \le M_y\),可以发现一共走的步数是确定的,那么就相当于解这样两个方程组: \[x_1 ...

  2. scanf用法及scanf中有\n的问题

    scanf()函数的原理 想象输入设备(键盘)连接着一个叫"缓冲"的东西,把缓冲认为是一个字符数组. 当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住 ...

  3. node.js中的fs.appendFile方法使用说明

    方法说明: 该方法以异步的方式将 data 插入到文件里,如果文件不存在会自动创建.data可以是任意字符串或者缓存. 语法: 代码如下: fs.appendFile(filename, data, ...

  4. UIScrollView的代理方法(delegate)

    // ViewController.m // 05-UIScrollView的代理(delegate) #import "ViewController.h" @interface ...

  5. 云端iclound使用-陈棚

    使用NSmetadataQuery查询文档,增加,删除,编辑 界面设计完成后效果如图: 程序清单:FKDiary.h @interface FKDiary : UIDocument @property ...

  6. GoogleGoogleGoogle!!!! 百度云资源

    一些谷歌镜像地址,够用了 Google 镜像站搜集 田飞雨 » Google 镜像站搜集 https://github.com/sxyx2008/DevArticles/issues/99 http: ...

  7. MATLAB 机器人学工具箱(Robotics Toolbox )sl_drivepoint 模型 consecutive zero crossings 问题

    操作环境 工具箱:Robotics Toolbox for MATLAB 版本 10.2.1 作者 Peter Corke MATLAB版本:R2018a 操作系统:win10 问题 sl_drive ...

  8. 微服务技术栈简单介绍,Eureka和Ribbon的引入和使用

    一.了解微服务架构 1.微服务技术栈 整体框架 整体学习规划路线2.微服务与单体架构的区别 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署 优势 结构简单 部署成本低 缺点 耦合度高, ...

  9. 再见收费的Navicat!操作所有数据库就靠它了!

    作为一名开发者,免不了要和数据库打交道,于是我们就需要一款顺手的数据库管理工具.很长一段时间里,Navicat 都是我的首选,但最近更换了一台新电脑,之前的绿色安装包找不到了. 于是就琢磨着,找一款免 ...

  10. netty系列之:channel和channelGroup

    目录 简介 神龙见首不见尾的channel channel和channelGroup channelGroup的基本使用 将关闭的channel自动移出 同时关闭serverChannel和accep ...