给定一颗二叉树,逐层打印,并且每层打印的方向是不一样的,比如:

逐层打印的结果是:
1

3 2

4 5 6

8 7

代码:

import java.util.ArrayList;
import java.util.Stack; public class Main { public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right; public TreeNode(int val) {
this.val = val;
}
} public static ArrayList<ArrayList<Integer>> printZigZag(TreeNode head) {
if(head == null) {
return null;
} Stack<TreeNode> s1 = new Stack<>();
Stack<TreeNode> s2 = new Stack<>(); ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); s1.push(head); while(!s1.isEmpty() || !s2.isEmpty()) {
if(!s1.isEmpty()) {
ArrayList<Integer> arr1 = new ArrayList<>();
while(!s1.isEmpty()) {
TreeNode t1 = s1.pop();
arr1.add(t1.val); //注意,一定要保证你插入到栈中的值不为空
if(t1.left!=null) {
s2.push(t1.left);
} if(t1.right!=null) {
s2.push(t1.right);
}
} res.add(arr1);
} else if(!s2.isEmpty()){
ArrayList<Integer> arr2 = new ArrayList<>();
while(!s2.isEmpty()) {
TreeNode t2 = s2.pop();
arr2.add(t2.val); if(t2.right!=null) {
s1.push(t2.right);
} if(t2.left!=null) {
s1.push(t2.left);
} } res.add(arr2);
}
} return res;
} public static void main(String[] args) {
TreeNode head = new TreeNode(1);
head.left = new TreeNode(2);
head.right = new TreeNode(3);
head.left.left = new TreeNode(4);
head.right.left = new TreeNode(5);
head.right.right = new TreeNode(6);
head.right.left.left = new TreeNode(7);
head.right.left.right = new TreeNode(8); ArrayList<ArrayList<Integer>> res = printZigZag(head); for(int i=0; i<res.size(); i++) {
ArrayList<Integer> res1 = res.get(i);
for(int j=0; j<res1.size(); j++) {
System.out.print(res1.get(j)+" ");
}
System.out.println();
}
}
}

之字形打印二叉树—Java的更多相关文章

  1. 剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)

    1. 题目描述 /** 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印, 第三行按照从左到右的顺序打印, 其他行以此类推. */ 2. 双向队列 ...

  2. 《剑指offer》第三十二题(之字形打印二叉树)

    // 面试题32(三):之字形打印二叉树 // 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺 // 序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, / ...

  3. 【剑指offer】之字形打印二叉树,C++实现

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打 ...

  4. Go语言实现:【剑指offer】按之字形打印二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. ...

  5. 剑指offer-面试题32-之字形打印二叉树-二叉树栈

    /* 题目: 分行按层自上向下呈之字形打印二叉树.第一行从左到右,第二行从右到左,第三行从左到右... */ /* 思路: 使用两个栈stack1和stack2. stack1存储从左向右打印的节点, ...

  6. 算法笔记_189:历届试题 横向打印二叉树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树 ...

  7. AcWing 45. 之字形打印二叉树

    地址 https://www.acwing.com/problem/content/description/43/ 题目描述请实现一个函数按照之字形顺序从上向下打印二叉树. 即第一行按照从左到右的顺序 ...

  8. 剑指Offer:面试题23——从上往下打印二叉树(java实现)

    问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...

  9. 22.从上往下打印二叉树 Java

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 就是二叉树的层序遍历.借助一个队列就可以实现.使用两个队列一个存放节点,一个存放值.先将根节点加入到队列中,然后遍历队列中的 ...

  10. 32-3题:LeetCode103. Binary Tree Zigzag Level Order Traversal锯齿形层次遍历/之字形打印二叉树

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

随机推荐

  1. (C语言)每日代码||2023.12.25||函数传参,传入数组时传递的是数组首元素地址

    向函数传入某数组时,可以在函数内修改该数组的元素. #include <stdio.h> void test(char* p, char arr[]) { *p = 'h';//能改变 * ...

  2. NC15532 Happy Running

    题目链接 题目 题目描述 Happy Running, an application for runners, is very popular in CHD. In order to lose wei ...

  3. CSS实现展开动画

    CSS实现展开动画 展开收起效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求--希望元素展开收起能具 ...

  4. 用ELK分析每天4亿多条腾讯云MySQL审计日志(1)--解决过程

    前言:      该文章将会介绍以下: 1,快速分析SQL日志的几种方法 2,使用mysql的全文索引快速分析少量SQL审计 3,准确快速分析4亿多条审计SQL日志(过程和最终解决方案) 公司核心库拆 ...

  5. 学习go语言编程之面向对象

    类型系统 类型系统是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容: 基础类型,如:byte.int.bool.float等 复合类型,如:数组.结构体.指针等 可以指向任意对象的类 ...

  6. flask操作mongodb

    一个简单的注册登录 from pymongo import MongoClient MC = MongoClient('127.0.0.1', 27017) MongoDB = MC['s2'] #创 ...

  7. instance must be started before calling this method

    解决方法 检查zk的连接数: 端口号: 数据库连接配置: zk的连接配置: 如果都没有问题,就重启容器.

  8. ASP.NET Core 微信支付(二)【 发布到服务器上签名加密时报错:系统找不到指定的文件 APIV3】

    参考资料 .Net微信支付退款操作"系统找不到指定的文件" 错误现象 微信支付(API v3)的统一下单接口和订单查询接口在本地调试成功,可以使用,但是发布到服务器上之后调用接口就 ...

  9. 一文上手图数据备份恢复工具 NebulaGraph BR

    作者:NebulaGraph 工程师 Kenshin NebulaGraph BR 开源已经有一段时间了,为了给社区用户提供一个更稳.更快.更易用的备份恢复工具,去年对其进行了比较大的重构.Nebul ...

  10. adb monkey 有哪些参数?

    adb monkey 是 Android Debug Bridge (ADB) 工具中的一个命令,用于执行随机事件来对 Android 应用进行压力测试.以下是 adb monkey 命令的一些常用参 ...