一.题意整理
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。也就是在层次遍历的基础上实现对整个树进行之字形顺序打印。
二.思路整理
先我们根据题目的描述,能够找到该题的解决模型为二叉树的层次遍历。只不过普通的层次遍历是针对每一层都只是从左到右遍历。这里题目要求奇数层是从左到右遍历,而偶数层则是从右到左遍历的。对于层序遍历我们知道可以利用队列来实现,给出层序遍历的模板:
void LevelOrder(BTree *t){
//利用队列来实现
Queue Q;
initQueue(Q);
EnQueue(Q,t);
while(!Empty(Q)){
TNode*p=DeQueue(Q);
//左右节点入队列
if(p->lchird) EnQueue(Q,p->lchird);
if(p->rchird) EnQueue(Q,p->rchird);
}
}
知道了层序遍历的遍历方法,下面我们就要考虑如何在遍历时候实现之字形顺序打印,由于之字形打印对于奇数和偶数层次上存在着正序和反序的区别,所以我们可以利用vector的尾插和头插来实现来实现。(第一层是从左往右,下一层就是从右往左)。
三.代码实现
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>>tr;
queue<TreeNode*>q;
q.push(pRoot);
int ans=0;//记录层数
while(q.size()){
vector<int>now;//每一层存储遍历结果
int len=q.size();
for(int i=0;i<len;i++){
TreeNode* top=q.front();
q.pop();
if(!top) continue;
//层次遍历
q.push(top->left);
q.push(top->right);
if(ans%2){
//直接在开始处插入类似头插 可以实现倒序
now.insert(now.begin(),top->val);
} else {
//直接尾插 实现了正序插入
now.push_back(top->val);
}
}
ans++;//层数记录
if(now.size()){
//每一层的遍历结果插入
tr.push_back(now);
}
}
return tr;
}
};