64:Binary Tree Zigzag Level Order Traversal

来源:互联网 发布:人生的意义 知乎 编辑:程序博客网 时间:2024/06/17 05:21

题目: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]
]

该题目同样也只需要在 level order 基础上逆序,但这时候是有条件的逆序

递归版本如下:

// 递归版本,时间复杂度 O(n)class Solution {public:        vector<vector<int>> zigzagLevelOrder(TreeNode* root) {                vector<vector<int>> result;                traverse(root, 1, result);                for (int i = 0; i != result.size(); ++i)                        if (i % 2 != 0)                                reverse(result[i].begin(), result[i].end());                return result;        }private:        void traverse(TreeNode* root, int level, vector<vector<int>>& result) {                if (!root) return;                if (level > result.size())                        result.push_back(vector<int>());                result[level - 1].push_back(root -> val);                traverse(root -> left, level + 1, result);                traverse(root -> right, level + 1, result);        }};

迭代版本如下:

// 迭代版本,时间复杂度 O(n),空间复杂度 O(n)class Solution {public:        vector<vector<int>> levelOrder(TreeNode* root) {                vector<vector<int>> result;                queue<TreeNode*> q1, q2;                TreeNode* cur = root;                if (cur != nullptr) q1.push(cur);                while (true) {                        if (q1.empty()) break;                        vector<int> tmp;                        while (!q1.empty()) {                                cur = q1.front();                                q1.pop();                                tmp.push_back(q1 -> val);                                if (cur -> left != nullptr) q2.push(cur -> left);                                if (cur -> right != nullptr) q2.push(cur -> right);                        }                        result.push_back(true);                        while (!q2.empty()) {                                q1.push(q2.front());                                q2.pop();                        }                }                for (int i = 0; i != result.size(); ++i)                        if (i % 2 != 0)                                reverse(result[i].begin(), result[i].end());                return result;        }};
0 0
原创粉丝点击