给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
解:
我们可以先把二叉树每一层的节点存储到二维数组中,例如上面的二叉树存储为:
[
[3],
[9,20],
[15,7]
]
然后按照从左往右或从右往左的顺序把节点的值放到另一个二维数组中。
/**
* 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 == NULL) {
return {};
}
vector<vector<TreeNode *>> treeVal;
vector<TreeNode *> top;
top.push_back(root);
treeVal.push_back(top);
//把二叉树的每个节点按照每一层放到二维数组中
for(int i=0; ; i++) {
vector<TreeNode *>temp;
for(auto ptr: treeVal[i]) {
if(ptr != NULL && ptr->left != NULL) {
temp.push_back(ptr->left);
}
if(ptr != NULL && ptr->right != NULL) {
temp.push_back(ptr->right);
}
}
if(temp.size() == 0) {
break;
}
treeVal.push_back(temp);
}
//cout<<treeVal.size();
vector<vector<int>> res;
//然后按照从左往右或从右往左的顺序把节点的值放到另一个二维数组中。
for(int i=0; i<treeVal.size(); i++) {
vector<int> temp;
if(i % 2 == 0) {
for(auto arr:treeVal[i]) {
temp.push_back(arr->val);
}
} else {
for(int j=treeVal[i].size()-1; j>=0; j--) {
temp.push_back(treeVal[i][j]->val);
}
}
res.push_back(temp);
}
return res;
}
};