作者:whisper
链接:https://proprogrammar.com/article/940
声明:请尊重原作者的劳动,如需转载请注明出处
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树:
[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回其层次遍历结果:
[ [3], [20,9], [15,7] ]提示:
节点总数 <= 1000
难度:中等;标签:树,广度优先搜索;编程语言:C++
我的解法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
vector<TreeNode*> cur;
vector<TreeNode*> next;
TreeNode* t;
vector<int> temp;
bool left;
public:
// c++ 修改32-II
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(!root)return res;
left = false;
cur.push_back(root);
while(!cur.empty()){
left = !left;
while(!cur.empty()){
t = cur.front();
cur.erase(cur.begin());
temp.push_back(t->val);
if(left){
if(t->left)next.push_back(t->left);
if(t->right)next.push_back(t->right);
}else{
if(t->right)next.push_back(t->right);
if(t->left)next.push_back(t->left);
}
}
vector<int> add;
temp.swap(add);
res.push_back(add);
cur.swap(next);
reverse(cur.begin(), cur.end());
}
return res;
}
};
层次遍历,这里有一点left和reverse,left指定先左后右还是先右后左,reverse翻转vector, 举个例子, [3,9,20,null,null,15,7]
, 第一层3,入结果,然后第二层9,20被reverse成20,9,入结果,第三层7,15,被reverse成15,7,入结果,正好是之字型
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if (!root) {
return result;
}
queue<TreeNode*> q;
q.push(root);
bool flag = true;
while (!q.empty()) {
int size = q.size();
vector<int> temp;
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
temp.push_back(node->val);
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
if (!flag) {
reverse(temp.begin(), temp.end());
}
flag = !flag;
result.push_back(temp);
}
return result;
}
};
差不多的解法,看上面解释就差不多理解了
亲爱的读者:有时间可以点赞评论一下
全部评论