题解 | #按之字形顺序打印二叉树#
按之字形顺序打印二叉树
https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> result; // 创建返回结果的二维数组
deque<TreeNode*> deq; // 创建双向队列,保存每层节点
if(pRoot) deq.push_back(pRoot); // 如果根节点不为空,将根节点放入队列中
int flag = 1; // 标记遍历每层节点的顺序,单数为从前向后,双数为从后向前
while(!deq.empty()){ // 队列不为空,进入循环
vector<int> temp_vec; // 创建临时数组,保存每层节点值
int size = deq.size(); // 先确定每层循环的次数
if(flag % 2){ // 如果标记值为单数,则从前向后遍历队列
for(int i = 0; i < size; ++i){
TreeNode* cur = deq.front(); // 队头节点赋给临时节点
temp_vec.push_back(cur->val); // 将临时节点的值加入临时数组中
deq.pop_front(); // 删除队头节点
if(cur->left) deq.push_back(cur->left); // 如果临时节点的左孩子不为空,将左孩子加入队列中
if(cur->right) deq.push_back(cur->right); // 如果临时节点的右孩子不为空,将右孩子加入队列中
}
}
else{ // 如果标记值为双数,则从后向前遍历队列
vector<TreeNode*> temp_node; // 创建节点数组,保存当前队列中的节点
for(int i = 0; i < size; ++i){ // 将队列中的节点放入节点数组中
temp_node.push_back(deq.front());
deq.pop_front();
}
for(int i = temp_node.size() - 1; i >= 0; --i){ // 倒叙遍历节点数组,节点值放入临时数组
temp_vec.push_back(temp_node[i]->val);
}
for(int i = 0; i < temp_node.size(); ++i){ // 将节点数组的左右孩子放入队列中
if(temp_node[i]->left) deq.push_back(temp_node[i]->left);
if(temp_node[i]->right) deq.push_back(temp_node[i]->right);
}
}
result.push_back(temp_vec); // 将临时数组加入到结果数组中
++flag; // 每次循环结束之后标记+1
}
return result;
}
};

查看17道真题和解析