题目

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:

给定二叉树 [3,9,20,null,null,15,7],

    3
/ \
9 20
/ \
15 7

返回锯齿形层次遍历如下:

[
[3],
[20,9],
[15,7]
]

考点

1.stack 双栈

2.tree

3.vector


思路

设置两个栈 , 分别用于存储不同层的子节点,存储的顺序和打印的顺序相反,所以用栈实现

为什么用两个栈,不用一个栈,通过上图分析,如果只有一个栈,打印完3之后,把7、6push入栈后,无法将2弹出。

首先将根节点放入开口向左的栈stack1里。

然后开始循环,因为有可能这个二叉树只有一个根节点,所以关于子树的操作之前,都要判断是否存在子树,否则可能出现野指针。

用cur和next表示两个栈的序号。当前栈的元素为空时,就进行下一个栈的打印,cur=1-cur;next=1-next;

结束条件:两个栈的元素都为空


代码

newcoder

/*
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<int> subret;
vector<vector<int>> ret; //1.入口检查
if(!pRoot)
return ret; int cur = 1;
int next = 0 ; //level[0]奇数级节点的栈,从左至右存储,level[1]偶数级节点的栈,从右至左存储,
stack<TreeNode*> level[2];
//level[0]:stack1,level[1]:stack2 //将根节点放入stack2中
level[1].push(pRoot); while(!level[0].empty()||!level[1].empty())
{
while(!level[cur].empty())
{
TreeNode* curNode=level[cur].top();
subret.push_back(curNode->val);
level[cur].pop();
if(cur==0)//
{
if(curNode->right)
level[next].push(curNode->right); if(curNode->left)
level[next].push(curNode->left);
}
else
{
if(curNode->left)
level[next].push(curNode->left); if(curNode->right)
level[next].push(curNode->right); }
}
if(level[cur].empty())
{
cur=1-cur;
next=1-next;
ret.push_back(subret);
subret.clear();
}
} return ret;
} };

leetcode 

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
//局部变量
std::stack<TreeNode*> stack1;
std::stack<TreeNode*> stack2;
vector<vector<int>> ret;
vector<int> temp; //鲁棒性检查
if(!root)
return ret; //栈1中放入根节点
stack1.push(root); //如果两个栈中还有节点
while(!stack1.empty()||!stack2.empty())
{
//栈2是空的就打印栈1
if(stack2.empty())
{
while(!stack1.empty())
{
///记录当前node,temp,pop
TreeNode* cur=stack1.top();
temp.push_back(cur->val);
stack1.pop();
//注意左右顺序
if(cur->left)
stack2.push(cur->left);
if(cur->right)
stack2.push(cur->right);
}
//栈1打印完,push temp容器,清空temp,
//开始打印栈2,操作和上面一样,只是左右顺序不同
ret.push_back(temp);
temp.clear();
}
else
{
if(stack1.empty())
{
while(!stack2.empty())
{
TreeNode* cur=stack2.top();
temp.push_back(cur->val);
stack2.pop();
if(cur->right)
stack1.push(cur->right);
if(cur->left)
stack1.push(cur->left);
}
ret.push_back(temp);
temp.clear();
}
}
} return ret;
}
};

问题

1.vector

使用时,要#include<vector> ,也要using namespace std;

因为queue和stack都是单进单出,所以只有push(),没有push_back()

2.双栈和二叉树有对称的情况,所以第二种解法更好。

32-3题:LeetCode103. Binary Tree Zigzag Level Order Traversal锯齿形层次遍历/之字形打印二叉树的更多相关文章

  1. (二叉树 BFS) leetcode103. Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  2. LeetCode103 Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  3. Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历

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

  4. 剑指offer从上往下打印二叉树 、leetcode102. Binary Tree Level Order Traversal(即剑指把二叉树打印成多行、层序打印)、107. Binary Tree Level Order Traversal II 、103. Binary Tree Zigzag Level Order Traversal(剑指之字型打印)

    从上往下打印二叉树这个是不分行的,用一个队列就可以实现 class Solution { public: vector<int> PrintFromTopToBottom(TreeNode ...

  5. LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

    103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...

  6. LeetCode解题报告—— Unique Binary Search Trees & Binary Tree Level Order Traversal & Binary Tree Zigzag Level Order Traversal

    1. Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) that ...

  7. 【leetcode】Binary Tree Zigzag Level Order Traversal

    Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...

  8. 37. Binary Tree Zigzag Level Order Traversal && Binary Tree Inorder Traversal

    Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...

  9. Binary Tree Zigzag Level Order Traversal (LeetCode) 层序遍历二叉树

    题目描述: Binary Tree Zigzag Level Order Traversal AC Rate: 399/1474 My Submissions Given a binary tree, ...

随机推荐

  1. JavaScript专题(二)闭包

    前言 - ES6 之前,JS没有块级作用域,只有全局作用域和函数作用域 用了许久ES6,春招在即,重写下博文. 还是讲讲闭包.我们要知其然,知其所以然. 仿佛大众情人一般,很多前端面试官都会问一问,说 ...

  2. c# log4Net 详细说明

    转载 http://www.cnblogs.com/kissazi2/p/3392605.html

  3. 自动化测试资源(一):谷歌浏览器驱动 ChromeDriver

    ChromeDriver(官网):https://sites.google.com/a/chromium.org/chromedriver/ (需要XX上网,官网里有驱动和浏览器的版本映射关系) (如 ...

  4. 设计模式——原型模式(Prototype)

    用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.——DP UML类图 模式说明 如果把在一张纸上手写一篇简历的过程看成是类的实例化过程,那么通过原型模式创建对象的过程就是拿着这张纸到复印 ...

  5. mitmproxy——抓取http、https

    mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler.Charles的功能.除了命令行形式的控制台,mitmproxy还有两个关联组件:mitmdump和mitmweb. ...

  6. Murano简介

    Project Mission The mission for this project is to provide a way to make third-party applications an ...

  7. cgkib动态代理详解-不依赖接口,速度快

    1. cglib原理-不依赖接口,速度快 使用ASM字节框架动态生成要代理类的子类,子类重写final以外的方法,织入横切逻辑 2. 示例-实现MethodInterceptor Test.java ...

  8. Solr7.x介绍安装和配置(单机版)

    之前学的是4.x,然后一看官网,奶奶的都7.x了.于是查了一番资料..... 1)下载和安装 wget http://mirror.bit.edu.cn/apache/lucene/solr/7.3. ...

  9. React搭建脚手架

    npm install -g create-react-app    //安装 create-react-app react-demo    // react-demo 项目的名称 cd react- ...

  10. Python开发环境Wing IDE如何调试进程异常报告

    Wing IDE的调试器所报告的任何异常,都会在调试器以外的任何代码运行事件中展示出来. 通过使用Debug工具或者是Debug菜单中的Start / Continue继续调试过程的异常检测. Win ...