方法一:递归的方法,使用一个flag记录不同层次的遍历顺序,这里需要注意使用vector中insert操作
/** * 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) { vector<vector<int>> result; //true reparesent traverse from left to right traverse(root, 1, result, true); return result; } void traverse(TreeNode * root, int level, vector<vector<int>> &result, bool flag) { if(root == nullptr) return; if(result.size() < level) result.push_back(vector<int>()); if(flag) result[level-1].insert(result[level-1].begin(), root->val); else result[level-1].push_back(root->val); if(root->right) traverse(root->right, level+1, result, !flag); if(root->left) traverse(root->left, level+1, result, !flag); } };
方法二:非递归方法,使用队列数据结构
/** * 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) { vector<vector<int>> result; if(!root) return result; queue<TreeNode *> que; que.push(root); //true represent traverse from left to right bool flag = true; while(!que.empty()) { vector<int> _result; vector<TreeNode *> tmp; while(!que.empty()) { _result.push_back(que.front()->val); tmp.push_back(que.front()); que.pop(); } result.push_back(_result); for(int i=tmp.size() - 1; i >= 0; --i) { if(flag) { if(tmp[i]->right) que.push(tmp[i]->right); if(tmp[i]->left) que.push(tmp[i]->left); } else { if(tmp[i]->left) que.push(tmp[i]->left); if(tmp[i]->right) que.push(tmp[i]->right); } } flag = !flag; } return result; } };
Binary Tree Zigzag Level Order Traversal
原文:http://www.cnblogs.com/chengyuz/p/6713217.html