Leetcode, BinaryTreeZigzagLevelOrderTraversal
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) { }
};
void traverse(TreeNode *root, size_t level, vector<vector<int>> &vec)
{
if (root == nullptr)
return;
if (level > vec.size())
vec.push_back(vector<int>());
if (level % 2 == 0)
{
vec[level - 1].insert(vec[level - 1].begin(), root->val);
}
else
{
vec[level - 1].push_back(root->val);
}
traverse(root->left, level + 1, vec);
traverse(root->right, level + 1, vec);
}
// 递归版,时间复杂度 O(n),空间复杂度 O(n)
vector<vector<int>> solution(TreeNode *root)
{
vector<vector<int>> result;
traverse(root, 1, result);
return result;
}
// 迭代版,时间复杂度 O(n),空间复杂度 O(1)
vector<vector<int>> solution2(TreeNode *root)
{
vector<vector<int>> result;
if (root == nullptr)
return result;
vector<int> level;
queue<TreeNode *> cur, next;
cur.push(root);
bool left_to_right = true;
while (!cur.empty())
{
while (!cur.empty())
{
TreeNode *p = cur.front();
cur.pop();
level.push_back(p->val);
if (p->left != nullptr)
next.push(p->left);
if (p->right != nullptr)
next.push(p->right);
}
if (!left_to_right)
std::reverse(level.begin(), level.end() );
left_to_right = !left_to_right;
result.push_back(level);
level.clear();
swap(cur, next);
}
return result;
}
int main()
{
TreeNode *node1 = new TreeNode(1);
TreeNode *node2 = new TreeNode(2);
TreeNode *node3 = new TreeNode(3);
TreeNode *node4 = new TreeNode(4);
TreeNode *node5 = new TreeNode(5);
TreeNode *node6 = new TreeNode(6);
TreeNode *node7 = new TreeNode(7);
node1->left = node2;
node1->right = node3;
node2->left = node4;
node2->right = node5;
node3->left = node6;
node3->right = node7;
//auto vec = solution(node1); //{1},{3,2},{4,5,6,7}
auto vec = solution2(node1); //{1},{3,2},{4,5,6,7}
return 0;
}