剑指offer:按之字形顺序打印二叉树_JohnLanbow的博客-程序员秘密

技术标签: code  

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路

在层序遍历的基础上,添加一个栈,并设置一个flag,当flag为true的时候从左至右打印,该层打印完成之后置flag为false;

紧接着一层为从右只左打印,将该层的n个节点从队列中弹出,压入栈中,再依次从栈中弹出元素并打印,该层打印完成之后置flag为true。循环……

vector<vector<int> > Print(TreeNode *pRoot) {
    vector<vector<int>> ve;
    if (pRoot == NULL) return ve;
    queue<TreeNode *> q;
    q.push(pRoot);
    int i = 1;
    bool flag = true;
    while (!q.empty()) {
        vector<int> v;
        int count = 0;
        if (flag) {
            for (int j = 0; j < i; ++j) {
                TreeNode *tmp = q.front();
                q.pop();
                v.push_back(tmp->val);
                if (tmp->left) {
                    q.push(tmp->left);
                    count++;
                }
                if (tmp->right) {
                    q.push(tmp->right);
                    count++;
                }
            }
            flag = false;
        }
        else{
            stack<TreeNode*> sta;
            for (int j = 0; j < i; ++j) {
                TreeNode *tmp = q.front();
                q.pop();
                sta.push(tmp);
                if (tmp->left) {
                    q.push(tmp->left);
                    count++;
                }
                if (tmp->right) {
                    q.push(tmp->right);
                    count++;
                }
            }
            while (!sta.empty()){
                TreeNode *tmp = sta.top();
                sta.pop();
                v.push_back(tmp->val);
            }
            flag = true;
        }
        i = count;
        ve.push_back(v);
    }
    return ve;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41111088/article/details/105182084

智能推荐

Node.js实现android的apk版本更新服务器_ShouCeng的博客-程序员秘密

以下内容仅为android程序员自己测试时搭建的简单测试服务器。 根据一般apk升级步骤: 1. 请求服务器versionCode和本地apk的versionCode比对,如果服务器versionCode大于apk的versionCode,则执行2),否则结束; 2. 弹出对话框,告知用户有新的版本可以更新,用户点击更新,则执行3)开始下载apk,否则结束; 3. 后台下载最新版本的apk。

io---BufferedOutputStream_flush-缓冲区写出字节时的缓冲区问题_outputstream怎么开启缓冲区_biu_biubiubiu的博客-程序员秘密

package io;import java.io.BufferedOutputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/**缓冲区写出字节时的缓冲区问题@author W*/public class Buff...

(转)[kaili linux]安装kaili linux到VM_jameskaron的博客-程序员秘密

转自:http://www.yishimei.cn/network/782.htmlkaili linux iso:https://www.kali.org/downloads/上次给大家介绍了关于黑客专用系统Kali Linux后,有许多小伙伴都表现出了极大的兴趣,但是想要彻底深入的学习Kali Linux,不仅要知道它的用途与大概介绍,更要亲身实践才能学到真正的黑客技能,考虑到...

JVM(三)--垃圾收集算法_想飞的盗版鱼的博客-程序员秘密

JVM(三)–垃圾收集算法这篇博客的内容包括:一、垃圾收集算法:1,标记——清除算法:2,复制算法:3,标记——整理算法:4,分代收集算法:二、涉及到的问题:1,标记清除,标记整理,复制算法分别是什么,各有什么缺点2,新生代和老年代各用什么算法?3,为什么要划分新生代和老年代?4,新生代分为什么?年轻代为什么分为Eden和Survior区?5,新生代和老年代的年龄阈值是多少?初识GC自动垃圾回收机制,简单来说就是寻找 Java堆中的无用对象。打个比方:你的房间是

adb实用命令(持续更新中....)_潇曜的博客-程序员秘密

1、获取手机屏幕当前显示的activity名与所属的包名:adb shell dumpsys window windows | findstr Current【延伸阅读】有人会有疑问:adb shell dumsys后面可以接哪些参数呢?其实很简单,我们在cmd中输入以下命令:adb shell service list,就会显示可以显示的参数:Found 178 services:0 ...

互联网产品设计进阶(10)关注项目的赢利模式_cndes的博客-程序员秘密

互联网产品设计进阶(10)关注赢利模式整天都在思考项目的进展,忙碌了一天,终于有点时间来打理思绪。晚上收到一封快件,收到一位编辑朋友送来的几本书,里面有一本最近比较热门的《设计原本》。读一本书时,我喜欢看书的前言,因为这里反映了作者的原始动机。正如书中所写,“思维的过程、人与人的

随便推点

【MyBatis】无法扫描到resources下的mapper配置文件_winrh的博客-程序员秘密

一般我们都是分离Java和配置文件,但是如果配置路径有问题,会导致找不到配置文件。在mybatis-config文件中,设置配置文件路径,注意:不要用.而是用/不要用.而是用/不要用.而是用/ &lt;mappers&gt; &lt;mapper resource="org/example/dao/EmployeeMapper.xml"/&gt; &lt;/mappers&gt;不然会扫描不到...

Intellij IDEA使用junit单元测试及其junit与spring版本不兼容问题_idea 和junit不兼容_oldbig_lin的博客-程序员秘密

Intellij IDEA自动创建单元测试,这在我之前的博客已有介绍  IntelliJ IDEA中用快捷键自动创建测试类下面是我在创建springboot测试类中的说明和遇到的问题创建好了测试类后1.测试service层测试类需要加上注解:@Runwith,@SpringBootTest2.测试Controller层测试类需要加上注解:@Runwith,@SpringB

sas:利用SQL连接表_中年英雄王叔叔的博客-程序员秘密

基本语句:select variable1, variable2, variable3.....from tablewhere condition1 and/or condition2....group by variable1, variable2, variable3......having condition1, condition2.....order by va

2023版最新最强大数据面试宝典_数据人生coding的博客-程序员秘密

2023年最新大数据面试宝典,目前已更新到第4版,广受好评!

java模拟实现一个基于文本界面的——客户信息管理系_junit 按照设计要求编写customerview,逐一实现各种方法_码走江湖的博客-程序员秘密

一:项目介绍介绍:模拟实现一个基于文本界面的——客户信息管理系 类和对象(属性、方法及构造器) 类的封装 引用数组 数组的插入、删除和替换 多对象协同工作 该简易系统能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表项目采用分级菜单方式。1、主菜单如下:—————–客户信息管理软件—————– 1 ...