**题目:**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).题目大意就是在一个二叉树上,以一个“之”字形状来遍历这课二叉树。
解决: 这题是放在标签为BFS里面的,一开始的想法就是开一个队列,对它的每一层广度优先搜索,由于又要是“之”字形状,所以就需要在扩展左右节点的顺序上进行选择就可以得到最后的答案。但是仔细思考一下,这样的方法是不行的,如果只是采用一个队列,无论你怎么变换左右遍历的顺序,也没法最后完成一个“之”字形状的遍历。举个具体的例子,假如就三层的二叉树,第一层扩展到第二层采用的是从右往左的顺序扩展,那么第二层到第三场呢?难道是从左往右,这样根本就无法得到最后的答案!说明这种方法是错误的!再仔细想想这个问题,“之”字形状遍历,怎么有点深搜的感觉呢?但是又不是完全的深搜!还有只有一个栈或者一个队列好像都不可以解决这个问题,那么,是不是可以采用两个栈空间,然后再变换左右扩展顺序!仔细想想好像可以试试,直接看代码
vector<vector<int>> zigzagLevelOrder(TreeNode* root)
{
vector<vector<int> > ans;
if(root==NULL)
return ans;
stack<TreeNode*> q1;//第一个栈
stack<TreeNode*> q2; //第二个栈
q2.push(root);
bool flag=0; //用于标记先向右还是先向左扩展
while(!q1.empty()||!q2.empty())//开始搜索
{
int len=max(q1.size(),q2.size());
vector<int> t;
while(len>0) //每一层的遍历
{
if(flag)
{
TreeNode* te=q1.top();
t.push_back(te->val);
q1.pop();
//拓展规则
if(te->right)
q2.push(te->right);
if(te->left)
q2.push(te->left);
}
else
{
TreeNode* te=q2.top();
q2.pop();
t.push_back(te->val);
if(te->left)
q1.push(te->left);
if(te->right)
q1.push(te->right);
}
len--;
}
flag=not flag;//下一层操作的时候,需要变换扩展规则
ans.push_back(t);//保存当层答案
}
return ans;
}
总结: 这题题目不难,但是更考验自己对深搜和广搜的理解,采用什么样的方法去扩展下一层的节点,采用什么样的数据结构,这些都是自己需要学习和思考的地方!