题目要求:
原题是牛客网剑指offer数据结构树的第二题。
- 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
- 数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 1500∣val∣<=1500
要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)
解题思路:
- 可以把二叉树的图形结构分为奇偶两种层数,从根节点开始为第一层为奇,接下来是第二层为偶以此类推。在代码中用一个int变量Flag记录当前层数的奇偶,0为奇数行,1为偶数行。
- 需要用一个栈压入二叉树节点,一个队列保存一次循环从栈中弹出的所有二叉树结点。
- 当栈不为空时,将栈顶元素记录,并存储栈顶元素节点的val值在vector中,将此节点压入队列后弹出栈,直到栈中所有元素移入到队列。
- 当队列不为空时,则取出队首元素向栈中压入子树节点,若Flag为0当前为奇数行,下一行为偶数行,输出顺序为从右至左,在压入栈中时需要相反顺序压入。则向栈中压入队首元素的(不为空)左孩子与(不为空)右孩子(Flag为1则压入右孩子与左孩子)。至此一次大循环结束,当栈与队列同时为空时,说明已经遍历完二叉树则break。
代码:
/*
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;
if(pRoot == nullptr)
{
return result;
}
stack<TreeNode*> s;
int count = 0;//0为奇数行,1为偶数行。
s.push(pRoot);
while(count == 1 || count == 0)
{
vector<int> ret;
queue<TreeNode*> arr;
if(count == 1)//如果为偶数行
{
while(s.size() != 0)
{
TreeNode* temp1 = s.top();
ret.push_back(temp1->val);
arr.push(temp1);
s.pop();
}
while(arr.size() != 0)
{
TreeNode* temp1 = arr.front();
if(temp1->right != nullptr)
{
s.push(temp1->right);
}
if(temp1->left != nullptr)
{
s.push(temp1->left);
}
arr.pop();
}
result.push_back(ret);
count = 0;
}
else if(count == 0)
{
while(s.size() != 0)
{
TreeNode* temp2 = s.top();
ret.push_back(temp2->val);
arr.push(temp2);
s.pop();
}
while(arr.size() != 0)
{
TreeNode* temp2 = arr.front();
if(temp2->left != nullptr)
{
s.push(temp2->left);
}
if(temp2->right != nullptr)
{
s.push(temp2->right);
}
arr.pop();
}
result.push_back(ret);
count = 1;
}
if(s.size() == 0 && arr.size() == 0)
{
break;
}
}
return result;
}
};