-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathBinary_Tree_Zigzag_Level_Order_Traversal.cpp
80 lines (71 loc) · 1.83 KB
/
Binary_Tree_Zigzag_Level_Order_Traversal.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
Example
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
*/
#include <vector>
#include <queue>
#include <algorithm>
#include "lintcode.h"
using namespace std;
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: A list of lists of integer include
* the zigzag level order traversal of its nodes' values
*/
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
// write your code here
vector<vector<int>> result;
queue<TreeNode*> myQueue;
if (root) {
myQueue.push(root);
}
bool zigzag = false;
while (!myQueue.empty()) {
vector<int> currentLevel;
int size = myQueue.size();
for (int i = 0; i < size; i++) {
TreeNode* current = myQueue.front();
myQueue.pop();
currentLevel.push_back(current->val);
if (current->left) {
myQueue.push(current->left);
}
if (current->right) {
myQueue.push(current->right);
}
}
if (zigzag) {
reverse(currentLevel.begin(), currentLevel.end());
}
zigzag = !zigzag;
result.push_back(currentLevel);
}
return result;
}
};