Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
/ \
9 20
/ \
15 7

return its zigzag level order traversal as:

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

思路:由于需要排成之字形,所以用一个栈来存储当前行的内容,另一个栈来存储下一行的内容。

以根为第0层,那么偶数层都应该从左向右输出。那么每次遇到偶数层,压入下一层奇数层时就按从左到右的顺序,这样弹栈时就是从右到左。

纠结了一会儿,AC了。

class Solution {
public:
vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
vector<vector<int>> ans;
if(root == NULL)
{
return ans;
}
int level = ; //记录当前层号
vector<TreeNode *> curlevel;
curlevel.push_back(root);
while(!curlevel.empty())
{
vector<int> partans;
vector<TreeNode *> nextlevel;
if(level % == ) //偶数层,根是第0层
{
while(!curlevel.empty()) //本层不为空
{
if(curlevel.back()->left != NULL) //先压入左边,再压入右边
{
nextlevel.push_back(curlevel.back()->left);
}
if(curlevel.back()->right != NULL)
{
nextlevel.push_back(curlevel.back()->right);
}
partans.push_back(curlevel.back()->val);
curlevel.pop_back();
}
ans.push_back(partans);
curlevel = nextlevel;
}
else
{
while(!curlevel.empty()) //本层不为空
{
if(curlevel.back()->right != NULL) //先压入右边,再压入左边
{
nextlevel.push_back(curlevel.back()->right);
}
if(curlevel.back()->left != NULL)
{
nextlevel.push_back(curlevel.back()->left);
}
partans.push_back(curlevel.back()->val);
curlevel.pop_back();
}
ans.push_back(partans);
curlevel = nextlevel;
}
level++;
}
return ans;
} void createTree(TreeNode * &root)
{
int n;
cin >> n;
if(n != )
{
root = new TreeNode(n);
createTree(root->left);
createTree(root->right);
}
}
};

看看别人的答案。思路不一样。

class Solution {
vector<vector<int> > result;
public:
vector<vector<int> > zigzagLevelOrder(TreeNode *root) { if(root!=NULL)
{
traverse(root, );
} for(int i=;i<result.size();i+=)
{
vector<int>* v = &result[i];
std:reverse(v->begin(), v->end());
}
return result;
} void traverse(TreeNode* node, int level)
{
if(node == NULL) return; vector<int>* row = getRow(level);
row->push_back(node->val); traverse(node->left, level+);
traverse(node->right, level+);
} vector<int>* getRow(int level)
{
if(result.size()<=level)
{
vector<int> newRow;
result.push_back(newRow);
}
return &result[level];
}
};

【leetcode】Binary Tree Zigzag Level Order Traversal (middle)的更多相关文章

  1. 【LeetCode】 Binary Tree Zigzag Level Order Traversal 解题报告

    Binary Tree Zigzag Level Order Traversal [LeetCode] https://leetcode.com/problems/binary-tree-zigzag ...

  2. 【leetcode】Binary Tree Zigzag Level Order Traversal

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

  3. 【Leetcode】【Medium】Binary Tree Zigzag Level Order Traversal

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

  4. 【树】Binary Tree Zigzag Level Order Traversal

    题目: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from lef ...

  5. leetCode 103.Binary Tree Zigzag Level Order Traversal (二叉树Z字形水平序) 解题思路和方法

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

  6. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历

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

  7. leetcode 103 Binary Tree Zigzag Level Order Traversal ----- java

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

  8. [leetcode]103. Binary Tree Zigzag Level Order Traversal二叉树来回遍历

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

  9. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal _ Medium tag: BFS

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

随机推荐

  1. 低版本IE浏览器 input元素出现叉叉的情况

    都说是IE10之上的浏览器才有这个问题,恰巧我IE10之上都没有问题,反而是低版本的浏览器出现了这个问题.作为一个凭证,我先放一张图片在这里面. 之前无意中解决过这个问题,如今复现确实是没有解决,网上 ...

  2. NetBeans使用习惯:升级与保存配置

    如何升级:点击 netbeans 的升级更新 ,即可升级版本:不推荐官网下载进行安装,否则会出现,以前的旧版本8.0的目录和8.0.1目录,虽然它会自动检测到以前版本的配置,提示导入... 如何备份: ...

  3. 清北学堂模拟day6 兔子

    [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...

  4. 如何在CentOS 6.5上安装EPEL 源

    EPEL 是什么? EPEL (Extra Packages for Enterprise Linux,企业版Linux的额外软件包) 是Fedora小组维护的一个软件仓库项目,为RHEL/CentO ...

  5. int long 等基础类型在不同平台的大小

    转自http://www.cnblogs.com/yishuiliunian/archive/2011/03/18/1988244.html 上次腾讯面试,问我int和long分别几个字节,结果被鄙视 ...

  6. Redis学习笔记二:单机数据库的实现

    1. 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个r ...

  7. activiti查看流程图,有中文乱码

    第一种 因为服务器缺少必要的字体到这的问题: 解决办法 <!-- 发布流程生成图片是正常显示中文 -->            <property name="activi ...

  8. 12个Linux进程管理命令介绍

    导读 执行中的程序称作进程.当程序可以执行文件存放在存储中,并且运行的时候,每个进程会被动态得分配系统资源.内存.安全属性和与之相关的状态.可以有多个进程关联到同一个程序,并同时执行不会互相干扰.操作 ...

  9. Eclipse 语法提示

    新建一个txt 拷贝下面的文本,然后保存修改扩展名为.epf #Sat Nov :: CST /instance/org.eclipse.jdt.core/org.eclipse.jdt.core.c ...

  10. Java工程为什么要加一个biz层

    biz是Business的缩写,实际上就是控制层(业务逻辑层).解释:控制层的主要作用就是协调model层和view层直接的调用和转换.能够有效的避免请求直接进行数据库内容调用,而忽略了逻辑处理的部分 ...