【剑指Offer-举例让抽象问题具体化】面试题32.2:之字形打印二叉树

题目描述

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

思路

  • 使用两个栈s1,s2:s1用来存储奇数层的节点,s2用来存储偶数层的节点(层数从1开始);
  • 先将根结点压入s1;
  • 当前层是奇数层时,弹出s1中的节点,并将弹出节点的左孩子、右孩子依次压入到s2中,直至s1为空;
  • 当前层是偶数层时,弹出s2中的节点,并将弹出节点的右孩子、左孩子依次压入到s1当中,直至s2为空;
  • 重复前面两步,直至s1,s2都为空。

代码如下:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>> ans;
        if(pRoot==nullptr)
            return ans;

        stack<TreeNode*> s1;
        stack<TreeNode*> s2;
        s1.push(pRoot);
        int curLayer = 1;    //当前是第几层
        while(!s1.empty() || !s2.empty()){
            if(curLayer%2!=0){
                vector<int> temp;    //存储当前层的节点
                while(!s1.empty()){
                    TreeNode* node = s1.top();
                    s1.pop();
                    if(node!=nullptr){
                        temp.push_back(node->val);
                        s2.push(node->left);
                        s2.push(node->right);
                    }
                }
                if(!temp.empty()){
                    //curLayer++;
                    ans.push_back(temp);
                }
            }
            else{
                vector<int> temp;
                while(!s2.empty()){
                    TreeNode* node = s2.top();
                    s2.pop();
                    if(node!=nullptr){
                        temp.push_back(node->val);
                        s1.push(node->right);
                        s1.push(node->left);
                    }
                }
                if(!temp.empty()){
                    //curLayer++;
                    ans.push_back(temp);
                }
            }
            curLayer++;
        }
        return ans;
    }

};

原文地址:https://www.cnblogs.com/flix/p/12632690.html

时间: 2024-10-10 04:21:10

【剑指Offer-举例让抽象问题具体化】面试题32.2:之字形打印二叉树的相关文章

剑指Offer——当当+搜狐+好未来笔试题+知识点总结

剑指Offer--当当+搜狐+好未来笔试题+知识点总结 情景回顾 时间:2016.9.21 15:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:当当笔试.搜狐笔试.好未来笔试 3场笔试中好未来相对简单点. 好未来编程题 马踏棋盘(贪心算法) ??马踏棋盘是经典的程序设计问题之一,主要的解决方案有两种:一种是基于深度优先搜索的方法,另一种是基于贪婪算法的方法.第一种基于深度优先搜索(DFS)的方法是比较常用的算法,深度优先搜索算法也是数据结构中的经典算法之一,主要是采用递归的

【Java】 剑指offer(34) 二叉树中和为某一值的路径

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 1.假设找到了其中一条路径,达到叶结点后,由于没有指向父结点的指针,所以必须提前创建一个链表存储前面经过的结点. 2.由于是从根结点出发,所以要想到使用前序遍历 3.利用链表存储结点,在该结点完成左右子树的路径搜索后(即递归函数结束,返回

一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)

数组中重复的数字 在上一篇博客中<剑指Offer>-- 题目一:找出数组中重复的数字(Python多种方法实现)中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素. 然后我们在博客用最复杂的方式学会数组(Python实现动态数组)这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组. 今天我们介绍一下另一道来自<剑指Offer>的关于数组的面试题--不修改数组找出重复的数字. 不修改数组找出重复的数字 题目二:不修改数组找出重复的数字 给定一个长度为 n+

剑指Offer对答如流系列 - 从上往下打印二叉树

面试题32:从上往下打印二叉树 题目描述 树的结构定义如下: public class Node{ int e; Node left; Node right; Node(int x) { e = x; } } (一)不分行从上到下打印二叉树 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印. 比如下面二叉树,输出顺序为 8 6 10 5 7 9 11 (二)分行从上到下打印二叉树 从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行. 比如下面二叉树,输出

剑指Offer名企面试官精讲典型编程题pdf

下载地址:网盘下载 <剑指Offer:名企面试官精讲典型编程题(第2版)>剖析了80个典型的编程面试题,系统整理基础知识.代码质量.解题思路.优化效率和综合能力这5个面试要点.<剑指Offer:名企面试官精讲典型编程题(第2版)>共分7章,主要包括面试的流程,讨论面试每一环节需要注意的问题:面试需要的基础知识,从编程语言.数据结构及算法三方面总结程序员面试知识点:高质量的代码,讨论影响代码质量的3个要素(规范性.完整性和鲁棒性),强调高质量代码除完成基本功能外,还能考虑特殊情况并对

剑指offer算法总结

剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行,只不过这本书的算法多看了几遍多做了几遍多了点心得体会.于是想总结一下.如果有错误也希望能指出,谢谢. 具体代码可以参考我的GitHub仓库: https://github.com/h2pl/SwordToOffer 数论和数字规律 从1到n整数中1出现的次数 题目描述 求出1~13的整数中1出现的

剑指Offer——Trie树(字典树)

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优

【剑指offer】第一个只出现一次的数

def FirstNotRepeatingChar(string): hashStr = [0] * 256 for c in string: hashStr[ord(c)] += 1 for c in string: if hashStr[ord(c)] == 1: return c 这里说下ord, 可以作为atoi来用,功能是若给定的参数是一个长度为1的字符串,那么若参数是Unicode对象,则返回对应的整数,若为8-bit的string,则返回对应的值. python的帮助文档里举例:

剑指Offer——银行考试

剑指Offer--银行考试 网申简历 一. 银行网申简历主要看哪些方面? 1.职业形象(30%),基本体现为证件照: 2.学校+成绩+校内表现(40%),体现为证书,成绩排名以及任职经历等: 3.校外实践(20%),主要体现在工作实习.实践活动和培训经历三点: 4.其他(10%),根据简历的完整性.准确性,进行综合评定. 二.网申简历应注意哪些方面? 1.考虑银行人的思维习惯(考虑岗位匹配度) 例:申请职位为柜员时,就应该在简历中体现出热情.乐于帮助他人.沉稳细心.认真大方,具有服务意识且对数字