32-3题:LeetCode103. Binary Tree Zigzag Level Order Traversal锯齿形层次遍历/之字形打印二叉树
题目
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树[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锯齿形层次遍历/之字形打印二叉树的更多相关文章
- (二叉树 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 ...
- 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 ...
- Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...
- 剑指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 ...
- LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)
103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...
- 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 ...
- 【leetcode】Binary Tree Zigzag Level Order Traversal
Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...
- 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 ...
- Binary Tree Zigzag Level Order Traversal (LeetCode) 层序遍历二叉树
题目描述: Binary Tree Zigzag Level Order Traversal AC Rate: 399/1474 My Submissions Given a binary tree, ...
随机推荐
- webpack安装及使用
npm run dev 第一次使用的时候用u盘将某些软件带过去. 所以要找到U盘 2.9.x的版本[推荐] 安装:npm install -g vue-cli 检测版本 vue -V/--versio ...
- Qt学习之网络编程(一)
一些说明 学了有一段时间的python了,小项目做了不少,最近由于项目需要,所以要回归老本行了,开始重点突击C++和qt.python的网络爬虫系列有时间就更吧. 获取本机网络信息 在网络应用中,经常 ...
- 2、kvm基础常用命令操作
KVM 虚拟机默认的配置文件在 /etc/libvirt/qemu 目录下,默认是以虚拟机名称命名的.xml文件,如下: root@xuedianhu:~# ls /etc/libvirt/qemu ...
- t-ora issue can't login mysql
https://github.com/tora-tool/tora/issues/99 ### TOra is an open-source multi-platform database manag ...
- 【转】《Unity Shader入门精要》冯乐乐著 书中彩图
为方便个人手机学习时候查阅,从网上转来这些彩图. 如属过当行为,联系本人删除. 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_s ...
- 将MySQL转化为mysqli
<?php/** * Created by PhpStorm. * User: 大神 * Date: 2017/7/24 * Time: 11:29 */ header('content-typ ...
- Ecshop如何解决Deprecated: preg_replace()报错
今天安装Ecshop后,运行出现各种问题,其中 Deprecated: preg_replace() 之类的报错最多,下面贴出解决方案: 错误原因: preg_replace() 函数中用到的修饰符 ...
- *.rpm is not signed解决
1.# yum install qemu*报错如下:Package qemu-kvm-tools-0.12.1.2-2.113.el6.x86_64.rpm is not signed2.解决# vi ...
- react的setState使用中遇到的问题
setState()更新的数据和自己预期的不一致 对 React 新手来说,使用 setState 是一件很复杂的事情.即使是熟练的 React 开发,也很有可能因为 React 的一些机制而产生一些 ...
- 全面理解HTTP协议
引言:作为一名软件工程Web专业学生,对于HTTP的熟悉掌握是必不可少的,特此做记录,打造自己的HTTP栈. URL与URI 我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么U ...