给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之> 间交替进行)。
例如:
给定二叉树[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回锯齿形层次遍历如下:
[ [3], [20,9], [15,7] ]
解法一:
//时间复杂度O(n), 空间复杂度O(n)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/**
* 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) {
if(!root) return {};
vector<vector<int>> res;
bool flag = false;
stack<TreeNode*> st1, st2;
st1.push(root);
while(!st1.empty()) {
st2.swap(st1);
res.push_back(vector<int>());
while(!st2.empty()) {
TreeNode* temp = st2.top();
st2.pop();
res[res.size() - 1].push_back(temp->val);
vector<TreeNode*> vec;
if(flag) vec = {temp->right, temp->left};
else vec = {temp->left, temp->right};
for(TreeNode* chd : vec) if(chd) st1.push(chd);
}
flag = !flag;
}
return res;
}
};
解法一:
迭代法。用两个栈st1、st2分别保存需要遍历的层及其下一层,还用一个布尔变量flag记录反转状态。当flag为true时,在循环中先入栈右子结点,再入栈左子结点(否则以相反顺序入栈)。其他过程类似第102题。
此题还可以先求出正常序列,最后对res隔行反转。
2019/11/17 20:43