解题思路:
思路1.大家的实现很多都是将每层的数据存进ArrayList中,偶数层时进行reverse操作,在海量数据时,这样效率太低了。
思路2.按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。
具体说:
设两个栈,s1存放奇数层,s2存放偶数层
遍历s1节点的同时按照左子树、右子树的顺序加入s2,
遍历s2节点的同时按照右子树、左子树的顺序加入s1
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> >res;
vector<int>temp;
stack<TreeNode*>s1;
stack<TreeNode*>s2;
if (pRoot == nullptr)return res;
int flag = 1;//标记奇偶数
s1.push(pRoot);
while (!s1.empty() || !s2.empty())
{
if (flag % 2 == 1)
{
while (!s1.empty())
{
TreeNode* p = s1.top();
temp.push_back(p->val);
if (p->left)
s2.push(p->left);
if (p->right)
s2.push(p->right);
s1.pop();
}
}
if (flag % 2 == 0)
{
while (!s2.empty())
{
TreeNode* p = s2.top();
temp.push_back(p->val);
if (p->right)
s1.push(p->right);
if (p->left)
s1.push(p->left);
s2.pop();
}
}
res.push_back(temp);
temp.clear();//释放内存
flag++;
}
return res;
}
};