1. 递归解法
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > result;
if(!root) return result;
levelTraversal(root, 1, true, result);
return result;
}
void levelTraversal(TreeNode* root, int level, int leftToRight, vector<vector<int> >& result) {
if(!root) return;
if(result.size() < level)
result.push_back(vector<int>({}));
if(leftToRight)
result[level-1].push_back(root->val);
else
result[level-1].insert(result[level-1].begin(), root->val);
levelTraversal(root->left, level+1, !leftToRight, result);
levelTraversal(root->right, level+1, !leftToRight, result);
}
};
2. 迭代解法
// 迭代解法
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > result;
if(!root) return result;
queue<TreeNode*> cur, next;
bool leftToRight = true;
cur.push(root);
while(!cur.empty()) {
vector<int> vec;
while(!cur.empty()) {
TreeNode *p = cur.front();
cur.pop();
vec.push_back(p->val);
if(p->left) next.push(p->left);
if(p->right) next.push(p->right);
}
if(!leftToRight) { // 如果是从右到左的遍历顺序,需要逆序
reverse(vec.begin(), vec.end());
}
result.push_back(vec);
swap(cur, next);
leftToRight = !leftToRight;
}
return result;
}
};