原创文章,转载请注明出处!

本题牛客网地址

博客文章索引地址

博客文章中代码的github地址

1.题目

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

例如:

输入二叉树

输出顺序

1

3 2

4 5 6 7

15 14 13 12 12 10 9 8

2.思路

本题使用两个栈作为辅助容器。打印某一层节点时,把下一层的子节点保存到栈内。如果当前打印的是奇数层,则先保存左子树节点再保存右子树节点到第一个栈内;如果当前打印的是偶数层,则先保存右子树在保存左子树节点到第二个栈内。

3.代码

  1 /*
  2 struct TreeNode {
  3     int val;
  4     struct TreeNode *left;
  5     struct TreeNode *right;
  6     TreeNode(int x) :
  7             val(x), left(NULL), right(NULL) {
  8     }
  9 };
 10 */
 11 class Solution {
 12 public:
 13     vector<vector<int> > Print(TreeNode* pRoot) {
 14
 15         // 存储结果
 16         vector<vector<int> > results;
 17         vector<int> rlt_temp;
 18
 19         // 边界条件
 20         if(pRoot == nullptr)
 21             return results;
 22
 23         // 辅助容器
 24         stack<TreeNode*> stk[2]; // stk[0]是奇数层,stk[1]是偶数层
 25         int now = 0;
 26         int next = 1;
 27         TreeNode* temp=pRoot;
 28
 29         // 根节点入栈
 30         stk[now].push(temp);
 31
 32         // 遍历两个栈,当两个栈均为空时,跳出循环
 33         while(!stk[now].empty() || !stk[next].empty()){
 34             // 存储遍历结果
 35             temp = stk[now].top();
 36             rlt_temp.push_back(temp->val);
 37             stk[now].pop();
 38
 39             // 当前层是奇数或偶数
 40             if(now==0)
 41             {
 42                 // 当前层是奇数时,左子树先入栈,右子树后入栈
 43                 if(temp->left!=nullptr)
 44                     stk[next].push(temp->left);
 45                 if(temp->right!=nullptr)
 46                     stk[next].push(temp->right);
 47             }
 48             else
 49             {
 50                 // 当前层是偶数时,右子树先入栈,左子树后入栈
 51                 if(temp->right!=nullptr)
 52                     stk[next].push(temp->right);
 53                 if(temp->left!=nullptr)
 54                     stk[next].push(temp->left);
 55             }
 56
 57             // 当前层为空时,打印下一层
 58             if(stk[now].empty())
 59             {
 60                 results.push_back(rlt_temp);
 61                 rlt_temp.clear();
 62                 now=1-now;
 63                 next = 1-next;
 64             }
 65         }
 66         return results;
 67     }
 68 };

转载于:https://www.cnblogs.com/wanglei5205/p/8639178.html

【剑指offer】之字形打印二叉树,C++实现相关推荐

  1. 《剑指offer》-逐层打印二叉树

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了. 先参考milolip的代码,写出这样 ...

  2. 剑指offer之中序打印二叉树(非递归实现)

    1 问题 中序打印二叉树(非递归实现),比如二叉树如下 /* 2* 3 5 * 1 4 2 3 * 3 2 1 5 1 4 2 3 中序:按左中右来打印二叉树,结果如下 3 1 2 3 1 4 5 2 ...

  3. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现

    剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...

  4. 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java

    <LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...

  5. 《LeetCode力扣练习》剑指 Offer 28. 对称的二叉树 Java

    <LeetCode力扣练习>剑指 Offer 28. 对称的二叉树 Java 一.资源 题目: 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的 ...

  6. LeetCode Algorithm 剑指 Offer 28. 对称的二叉树

    剑指 Offer 28. 对称的二叉树 Ideas 一开始想的有问题,看了例子以为对称二叉树的中序遍历序列是回文数组,然后就用这么写了,结果到第192个测试用例[1,2,2,2,null,2]就失败了 ...

  7. 【LeetCode】剑指 Offer 28. 对称的二叉树

    [LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...

  8. 剑指 Offer 28. 对称的二叉树 -- 递归

    0 题目描述 leetcode原题链接:剑指 Offer 28. 对称的二叉树 1 递归解法 对称二叉树定义: 对于树中 任意两个对称节点 LLL 和 R,R,R, 一定有: L.val=R.val: ...

  9. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  10. 剑指offer:顺时针打印矩阵

    题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 ...

最新文章

  1. centos7虚拟机使用docker搭建swoole环境
  2. ajax 导出文件给 文件重新命名_Tanner LEdit 05 | 导出GDSII文件
  3. 文件打包成zip类型文件
  4. Procedure execution failed 2013 - Lost connection to MySQL server during query
  5. JAVA高精度计算工具
  6. python求取列表中的质数
  7. java基础知识陷阱
  8. css 字体倾斜_css笔记3(文本,列表,背景声明)
  9. 计算机考研专业综合考试二,2015计算机考研大纲:专业基础综合考试大纲原文(2)...
  10. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
  11. Selenium 方法封装 一
  12. Spring源码探究:容器
  13. python下载前获取文件大小
  14. 使用WinImage的命令行修改img文件
  15. qart 图形二维码 html2canvas下载二维码
  16. MySQL之Explain
  17. Matlab似然比检验函数,似然比检验 LRT
  18. 专业课课本复习(数电,通原,数信,信号与系统,数据结构)
  19. org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。 的解决办法
  20. 关于eMule下载伤硬盘的话题

热门文章

  1. 微信小程序 data中数据值的更改与储存
  2. Android移动应用基础教程【使用内容提供者共享数据】
  3. 最长公共子串_两个字符串的最长公共子串(后缀自动机)
  4. spingbot 与 activiti 整个 中创建表而找不到表的问题(创建表失败)
  5. 按层次遍历二叉树_LeetCode | 102.二叉树的层次遍历
  6. java函数调用实例_Java使用方法引用实现任意对象的实例方法
  7. C#程序打包与部署,包括处理安装向导中用户输入的参数,创建卸载程序。
  8. cent os7 安装nginx1.16.1
  9. java 线程状态_Java线程的状态
  10. php实现语音留言,iPhone实现语音留言 新技能get