题目描述
分析
对于层序遍历,不能够使用递归的方式,一般直接进行搜索。
类似题目:二叉树的层序遍历,使用队列存储每层要访问的对象。
本题在此之上要求相邻两层的遍历方向相反。对于第层的最后一个遍历的元素,其子节点优先被遍历,是和栈后进先出的特点相符合的。
解题思路
使用栈来存储每层待访问的节点指针。
搜索具有很明确的代码模板。
搜索模板
INIT:
q : 线性表
q.push(root)
ITERATION:
while !q.empty():
curr = q.front()
q.pop()
visit( curr ) // 遍历
neighbors = get_neighbors( curr ) // 与curr相邻的待访问的节点
q.push( neighbors )
算法
INPUTS: root
OUTPUTS: layers
ans = []
s_layers.push( root )
depth = 0
while !s_layers.empty() :
next_layers = []
layer_visit = []
while !s_layers.empty():
curr = s_layers.front()
s_layers.pop()
layer_visit.push( curr )
if depth%2 :
if curr->left != NULL :
next_layer.push( curr->left )
if curr->right != NULL :
next_layer.push( curr->right )
else :
if curr->right != NULL :
next_layer.push( curr->right )
if curr->left != NULL :
next_layer.push( curr->left )
// BEGIN NEXT LAYER,维护循环不变量
s_layers = next_layers
ans.push( layer_visit )
++ depth
数据结构
这道题主要使用栈来进行遍历顺序上的模拟。
使用
复杂度分析
时间和空间复杂度都是
代码实现
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> ans ;
if ( root == NULL ){
return ans ;
}
stack<TreeNode*> s ;
s.push( root ) ;
int depth = 0 ;
while ( !s.empty() ){
// 遍历一层
vector<int> tmp ;
stack<TreeNode*> nextS ;
while ( !s.empty() ){
TreeNode* curr = s.top() ;
s.pop() ;
tmp.push_back( curr->val ) ;
if ( depth % 2 ){
if ( curr->right != NULL ){
nextS.push( curr->right ) ;
}
if ( curr->left != NULL ){
nextS.push( curr->left ) ;
}
}else{
if ( curr->left != NULL ){
nextS.push( curr->left ) ;
}
if ( curr->right != NULL ){
nextS.push( curr->right ) ;
}
}
}
ans.push_back( tmp ) ;
s = nextS ; //可以么
++ depth ;
}
return ans ;
}
};
相关问题
PS.
相比较于其他已有的leetcode刷题笔记,我希望能够提供相关的解题分析和部分相关问题的链接,使得大家能获得一个较好的分析与相关问题的比较。
偶尔会进行类似题目的总结工作,有需要的读者可以对这份工作进行关注。
如果你发现有相关的错误或者表述不当不清晰的地方,请进行评论,我会尽快进行核对勘正。