1.题目
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
2.基本想法
1
/ \
3 4
/ \ / \
5 6 7 8
上一层和下一层输出顺序相反,那么很容易想到使用栈。对节点1来说,入栈顺序应为3,4;3为1的左子节点,4为1的右子节点。对第三层节点来说入栈顺序应为8,7,6,5。其中8为4的右子节点,7为4的左子节点。
如果使用两个栈的话,输出要求就很容易满足。但是节点入栈的顺序有不同
- 对于栈1,节点的左子节点入栈,而后节点的右子节点入栈
- 对于栈2,节点的右子节点先入栈,而后节点的左子节点入栈
所以实现流程如下:
- 步骤1:根节点入栈s1
- 步骤2:栈s1中节点出栈,同时出栈节点按照先左子节点而后右子节点的顺序进入栈r2
- 步骤3:栈s2的节点出栈,同时出栈节点按照先右子节点而后再左子节点的顺序进入栈r1
- 重复步骤2~3,直到两个栈都为空为止
3.代码如下
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if(pRoot==NULL)
return res;
stack<TreeNode*> s1;
stack<TreeNode *> s2;
TreeNode *p=pRoot;
s1.push(p);
while(s1.size() || s2.size())
{
vector<int> it;
while(s1.size())
{
p=s1.top();
s1.pop();
it.push_back(p->val);
if(p->left)
s2.push(p->left);
if(p->right)
s2.push(p->right);
}
if(it.size())
res.push_back(it);
vector<int> is;
while(s2.size())
{
p=s2.top();
s2.pop();
is.push_back(p->val);
if(p->right)
s1.push(p->right);
if(p->left)
s1.push(p->left);
}
if(is.size())
res.push_back(is);
}
return res;
}