题目

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

例如:

给定二叉树 [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. JS滑动下划线导航菜单实现原理

    效果如下:http://campus.51job.com/test/zengxl/js html: <div class="mainnav"> <div clas ...

  2. 前端实现Tab切换栏

    tab切换,所需的 UI 只有两组元素 - Header 和 Tab,下面介绍几种不同的实现方法和他们的优缺点 本文主要说一些 CSS 的实现方法.最好的方法是 第四种 => label + i ...

  3. <checking for mysql_config not found>

    php 5.3.29编译安装排错: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --w ...

  4. C 碎片五 数组

    构造类型数据是有基本类型数据按照一定规则组成的.数组,结构体,共用体都属于构造类型的数据.数组是有序数据的集合,C语言数组中的每一个元素都属于同一个数据类型,用数组名和下标来唯一确定数组中的元素. 一 ...

  5. 基于FCM的消息推送功能

    需求背景 我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理.考虑到项目需要以及成本,我们选择使用谷歌的FCM框 ...

  6. 一、 Spring IOC 简介

    一 . 什么是IOC(Inversion of Control) IOC :控制反转,也称为依赖注入(DI).听起来有点云里雾里,他到底是个啥,为什么Spirng中最基础的就是它? 我们的项目其实都是 ...

  7. nodejs入门学习笔记二——解决阻塞问题

    在最开始,我们要弄清楚node会什么会存在阻塞? node是这么标榜自己的:“在node中除了代码,所有一切都是并行执行的!” 意思是,Node.js可以在不新增额外线程的情况下,依然可以对任务进行并 ...

  8. Python接入支付宝进行PC端支付

    1.  支付宝开放平台登录,使用支付宝账号登录 https://open.alipay.com/platform/home.htm 2.选择沙箱模式 [支付宝提供了测试环境] https://docs ...

  9. path的join和resolve

    连接路径:path.join([path1][, path2][, ...]) path.join()方法可以连接任意多个路径字符串.要连接的多个路径可做为参数传入. path.join()方法在接边 ...

  10. 零基础逆向工程27_Win32_01_宽字符_MessageBox_win32调试输出

    1 多字节字符 ASCII码表:0 ~ 2^7-1 扩展ASCII码表:2^7 ~ 2^8-1 什么是GB2312:1980年,两个字节存储一个汉字:不通用,别国会有乱码. UCICODE:只有一个字 ...