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).
For 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]
]
我的迭代解法如下:
vector<vector<int> > zigzagLevelOrder(TreeNode *root) { vector<vector<int> > res; vector<TreeNode *> iter; if (root) iter.push_back(root); int isForward = 1; while (!iter.empty()) { int size = iter.size(); vector<int> level; for (int i = 0; i < size; ++i) { level.push_back(iter[i]->val); if (iter[i]->left) iter.push_back(iter[i]->left); if (iter[i]->right) iter.push_back(iter[i]->right); } if (!isForward) reverse(level.begin(), level.end()); res.push_back(level); iter.erase(iter.begin(), iter.begin() + size); isForward ^= 0x01; } return res; }
我的递归解法如下:
class Solution { public: vector<vector<int> > zigzagLevelOrder(TreeNode *root) { res.clear(); if (!root) return res; zigzagLevelOrder(root, 1); return res; } private: vector<vector<int> > res; void zigzagLevelOrder(TreeNode *root, int level) { if (res.size() < level) res.resize(level); if (level % 2) res[level - 1].push_back(root->val); else res[level - 1].insert(res[level - 1].begin(), root->val); if (root->left) zigzagLevelOrder(root->left, level + 1); if (root->right) zigzagLevelOrder(root->right, level + 1); } };
两种算法的时间性能相同,如下图所示:
时间: 2024-10-15 05:20:02