剑指offer系列34----按之字形顺序打印二叉树
【题目】请实现一个函数按照之字形打印二叉树,
* 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,
* 其他行以此类推。
未优化,不是最优解,博主用的是队列,我用的栈。
方法一:直接打印
package com.exe7.offer; import java.util.Stack; import org.junit.Test; /**方法一:直接打印
* 【题目】请实现一个函数按照之字形打印二叉树,
* 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,
* 其他行以此类推。
* @author WGS
*
*/
public class PrintBiTree {
static class TreeNode{
int val=0;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val){
this.val=val;
}
} public void printZhiTree(TreeNode pRoot){
if(pRoot==null) return;
Stack<TreeNode> stack1=new Stack<>();
Stack<TreeNode> stack2=new Stack<>();
stack1.push(pRoot);
int toBePrint=1;
int nextLevelNodes=0;
int level=1;
TreeNode tempNode=null; while(!stack1.isEmpty() || !stack2.isEmpty()){
if(level%2!=0){
tempNode=stack1.pop();
System.out.print(tempNode.val+" ");
--toBePrint;
if(tempNode.left!=null){
stack2.push(tempNode.left);
++nextLevelNodes;
}
if(tempNode.right!=null){
stack2.push(tempNode.right);
++nextLevelNodes;
}
}else{
tempNode=stack2.pop();
System.out.print(tempNode.val+" ");
--toBePrint; if(tempNode.right!=null){
stack1.push(tempNode.right);
++nextLevelNodes;
}
if(tempNode.left!=null){
stack1.push(tempNode.left);
++nextLevelNodes;
}
}
//
if(toBePrint==0){
System.out.println("------------------");
level++;
toBePrint=nextLevelNodes;
nextLevelNodes=0;
}
} } //测试类
public static void main(String[] args){
PrintBiTree p=new PrintBiTree();
TreeNode root = new TreeNode(8);
TreeNode node1 = new TreeNode(6);
TreeNode node2 = new TreeNode(10);
TreeNode node3 = new TreeNode(5);
TreeNode node4 = new TreeNode(7);
TreeNode node5 = new TreeNode(9);
TreeNode node6 = new TreeNode(11);
TreeNode node7 = new TreeNode(12);
TreeNode node8 = new TreeNode(13);
TreeNode node9 = new TreeNode(14);
TreeNode node10 = new TreeNode(15);
TreeNode node11 = new TreeNode(16);
TreeNode node12 = new TreeNode(17);
TreeNode node13 = new TreeNode(18);
TreeNode node14 = new TreeNode(19); root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
node3.left=node7;
node3.right=node8;
node4.left=node9;
node4.right=node10;
node5.left=node11;
node5.right=node12;
node6.left=node13;
node6.right=node14; p.printZhiTree(root);
} }
方法二:面试需要
package com.exe7.offer; import java.util.ArrayList;
import java.util.Stack; /**方法二:面试时候需要
* 【题目】请实现一个函数按照之字形打印二叉树,
* 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,
* 其他行以此类推。
* @author WGS
*
*/
public class PrintBiTree2 {
static class TreeNode{
int val=0;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val){
this.val=val;
}
} public ArrayList<ArrayList<Integer>> printZhiTree(TreeNode pRoot){
ArrayList<ArrayList<Integer>> list=new ArrayList<>();
if(pRoot==null) return list;
ArrayList<Integer> nodeList=new ArrayList<Integer>();
Stack<TreeNode> stack1=new Stack<>();
Stack<TreeNode> stack2=new Stack<>();
stack1.push(pRoot);
int toBePrint=1;
int nextLevelNodes=0;
int level=1;
TreeNode tempNode=null; while(!stack1.isEmpty() || !stack2.isEmpty()){
if(level%2!=0){//奇数层
tempNode=stack1.pop();
//System.out.print(tempNode.val+" ");
nodeList.add(tempNode.val);
--toBePrint;
if(tempNode.left!=null){
stack2.push(tempNode.left);
++nextLevelNodes;
}
if(tempNode.right!=null){
stack2.push(tempNode.right);
++nextLevelNodes;
} }else{
tempNode=stack2.pop();
//System.out.print(tempNode.val+" ");
nodeList.add(tempNode.val);
--toBePrint; if(tempNode.right!=null){
stack1.push(tempNode.right);
++nextLevelNodes;
}
if(tempNode.left!=null){
stack1.push(tempNode.left);
++nextLevelNodes;
}
/* if(toBePrint==0){
System.out.println();
list.add(nodeList);
level++;
toBePrint=nextLevelNodes;
nextLevelNodes=0;
nodeList=new ArrayList<Integer>();
}*/
}
if(toBePrint==0){
System.out.println();
list.add(nodeList);
level++;
toBePrint=nextLevelNodes;
nextLevelNodes=0;
nodeList=new ArrayList<Integer>();
}
}
return list; } //测试类
public static void main(String[] args){
PrintBiTree2 p=new PrintBiTree2();
TreeNode root = new TreeNode(8);
TreeNode node1 = new TreeNode(6);
TreeNode node2 = new TreeNode(10);
TreeNode node3 = new TreeNode(5);
TreeNode node4 = new TreeNode(7);
TreeNode node5 = new TreeNode(9);
TreeNode node6 = new TreeNode(11);
TreeNode node7 = new TreeNode(12);
TreeNode node8 = new TreeNode(13);
TreeNode node9 = new TreeNode(14);
TreeNode node10 = new TreeNode(15);
TreeNode node11 = new TreeNode(16);
TreeNode node12 = new TreeNode(17);
TreeNode node13 = new TreeNode(18);
TreeNode node14 = new TreeNode(19); root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
node3.left=node7;
node3.right=node8;
node4.left=node9;
node4.right=node10;
node5.left=node11;
node5.right=node12;
node6.left=node13;
node6.right=node14; ArrayList<ArrayList<Integer>> getList=p.printZhiTree(root);;
for(ArrayList<Integer> a:getList){
System.out.println(a);
} } }
剑指offer系列34----按之字形顺序打印二叉树的更多相关文章
- 剑指offer 面试题. 按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 方法1: 正常层次遍历,利用普通队列.逢 ...
- 剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出
剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Coll ...
- 剑指 Offer 32 - III. 从上到下打印二叉树 III
剑指 Offer 32 - III. 从上到下打印二叉树 III 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, ...
- 剑指 Offer 32 - II. 从上到下打印二叉树 II + 层次遍历二叉树 + 按层存储
剑指 Offer 32 - II. 从上到下打印二叉树 II Offer_32 题目描述: 题解分析: 这道题我一开始想到的解决方法较粗暴,就是使用两个变量来记录当前层的节点数和下一层的结点数. 以上 ...
- 剑指 Offer 32 - I. 从上到下打印二叉树 + 层次遍历二叉树
剑指 Offer 32 - I. 从上到下打印二叉树 Offer_32_1 题目描述 解题思路 这题属于简单题,考察的是我们对二叉树以及层次遍历的方法. 这里只需要使用简单的队列即可完成二叉树的层次遍 ...
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,1 ...
- 剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - I. 从上到下打印二叉树 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 ...
- 每日一题 - 剑指 Offer 32 - III. 从上到下打印二叉树 III
题目信息 时间: 2019-06-25 题目链接:Leetcode tag:双端队列 难易程度:中等 题目描述: 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右 ...
- 剑指offer 23:从上往下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 按照从左往右从上到下的顺序打印节点,需要我们维护一个队列,这个队列放入元素的顺序是访问队头节点(起始先放入根节点),则若当前 ...
- 剑指offer——33分行从上到下打印二叉树
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题解: 使用BFS,按层打印即可 class Solution { public: vector<vector&l ...
随机推荐
- apache配置文件 httpd-vhosts.conf 和 htaccess
1.apache多站点配置中ServerAlias什么意思? -:就是给ServerName起别名,通过Alias中的域名也可以访问这个虚拟主机. eg: <VirtualHost www.be ...
- PAT (Basic Level) Practise:1007. 素数对猜想
[题目链接] 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素数”. ...
- 【转】java环境配置
JAVA开发环境的搭建(配置JAVA开发环境) 一.安装JDK 1. JVM(Java Virtual Machine—Java虚拟机) JRE(Java Runtime Environment—Ja ...
- 漫水填充算法 - cvFloodFill() 实现
前言 漫水填充算法是用来标记一片区域的:设置一个种子点,然后种子点附近的相似点都被填充同一种颜色. 该算法应用性很广,比如目标识别,photoshop 的魔术棒功能等等,是填充类算法中应用最为广泛的一 ...
- Bandicam视频录制技巧总结+小丸工具箱压缩视频解决视频体积问题
1.视频录制. 录制质量建议选择100,保证原文件的质量才能更好地保证渲染转码后输出视频的质量.音效这里就一个关键点,就是编码器默认的MPEG-1 L2,会导致会声会影渲染输出出错,程序强行关闭,Ve ...
- C#使用FtpWebRequest上传文件
System.Net命名空间下的FtpWebRequest类实现了ftp协议的.Net实现. FtpWebRequest.KeepAlive指定在请求完成后服务器是否要马上关闭连接 FtpWebReq ...
- Codeforces Round #366 (Div. 2) A
A. Hulk time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces Round #118 (Div. 2)
A. Comparing Strings 判断不同的位置个数以及交换后是否相等. B. Growing Mushrooms 模拟. C. Plant 矩阵+快速幂 D. Mushroom Scient ...
- 后台向前台传递entity的list然后构筑combobox的方法(easyui)
遇问题,莫着急,深呼吸. 后台写法:JsonUtil.toJson(new ArrayList<Entity>());此处jsonUtil是已封装的方法,即将entity的list转为js ...
- java基础之:详解内部类(转载)
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...