题解 | #二叉树的之字形层序遍历#
二叉树的之字形层序遍历
http://www.nowcoder.com/practice/47e1687126fa461e8a3aff8632aa5559
//算法思想:利用队列思想层次遍历,front是队头指针,rear是队列尾指针,last为二叉树每层最右结点下标,depth用来记录层并判断怎么把元素放入队列中,
//1.每次front<rear时进入循环,否则返回结果
//2.先使用depth判断元素是从左向右还是从右向左进队列,
//3.然后在将而二叉树入队列
继续执行1
class Solution {public:
/**
*
* @param root TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
if(root == NULL)
return {};
else{
vector<TreeNode*> s;
vector<vector<int>> t;
int depth=0,front=-1,rear=-1,last=0;
s.emplace_back(root);
rear++;
while(front < last)
{
if(depth%2 == 0)
{
int f=front; //临时变量
t.resize(depth+1);
//将元素入队列,从左向右
while(f<last)
{
f++;
t[depth].emplace_back(s[f]->val);
}
//将树节点入队列
while(front < last)
{
front++;
if(s[front]->left)
{
s.emplace_back(s[front]->left);
rear++;
}
if(s[front]->right)
{
s.emplace_back(s[front]->right);
rear++;
}
}
last=rear; //二叉树最右结点
}
else
{
int f=front;
int l=last;
t.resize(depth+1);
//将元素入队列,从右向左
for(int i=last;i>front;i--)
t[depth].emplace_back(s[i]->val);
//将树节点入队列
while(front<last)
{
front++;
if(s[front]->left)
{
s.emplace_back(s[front]->left);
rear++;
}
if(s[front]->right)
{
s.emplace_back(s[front]->right);
rear++;
}
}
}
last=rear; //last指向最右结点下标
depth++; //深度+1
}
return t;
}
}
};