103. Binary Tree Zigzag Level Order Traversal
仅供自己学习
思路:
前面做过102,题目几乎相同,只是输出的方式不同,下意识BFS就选择了队列,但是发现不能解决,因为是单向取单向入得结构,不能从满足一左一右的输出形式。上课的时候了解到一个双端队列,刚好可以满足,只需要一个标记此时是左输出还是右输出即可。当时只想用一个双端队列即可,但是发现写着还是会有一堆bug,例如从后面取,但是新元素也往后面加入,那么就会有冲突。于是就在用一个队列来辅助,队列只用来暂时存储元素,而双端队列就用来决定队列里的元素是从后面加入还是前面加入。当我们从左输出,那么我们队列就从双端队列后面入队,从右输出那么就从双端队列前面入队。
代码:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int>> zigzagLevelOrder(TreeNode* root) { 13 if(root==NULL) return {}; 14 queue <TreeNode*> q1; 15 q1.push(root); 16 vector<vector<int>> res; 17 int tag=1; 18 while(!q1.empty()){ 19 deque <int> q; 20 int size=q1.size(); 21 while(size--){ 22 TreeNode* temp=q1.front(); 23 q1.pop(); 24 if(tag==1) q.push_back(temp->val); 25 else q.push_front(temp->val); 26 if(temp->left) q1.push(temp->left); 27 if(temp->right) q1.push(temp->right); 28 } 29 tag=!tag; 30 res.emplace_back(vector<int>{q.begin(), q.end()}); 31 32 } 33 return res; 34 } 35 };
还有一种可以只用一个队列就解决的方法,因为我们已经知道了每层的长度,同时我们循环的时候还是用的size--,那么每加一个元素这一层的size就会--,那么我们是否可以用这个变量来确定在vector的哪个索引加入元素呢。我们在每层都声明一个vector,并且获取它的长度,那么从左开始输出的话那么索引的位置就为 vector.size() - size -1,那么他就会从左向右从队列加入元素,从右开始输出就是size,那么就会从右向左从队列加入元素。那么我们就用一个tag来判断是从左输出还是右输出。
代码:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int>> zigzagLevelOrder(TreeNode* root) { 13 vector<vector<int>> res; 14 queue<TreeNode*> q; 15 if(root)q.push(root); 16 int tag=1; 17 while(!q.empty()){ 18 int size=q.size(); 19 vector<int> level(size,0); 20 while(size--){ 21 TreeNode* temp = q.front(); 22 q.pop(); 23 level[tag?level.size()-size-1:size]=temp->val; 24 if(temp->left) q.push(temp->left); 25 if(temp->right) q.push(temp->right); 26 } 27 res.push_back(move(level)); 28 tag=!tag; 29 } 30 return res; 31 } 32 };

浙公网安备 33010602011771号