题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路:
- 设置两个栈ltr和rtl,ltr存放奇数层结点,rtl存放偶数层结点。
- 预设奇数层从左往右的顺序打印,即结点入栈的时候按照先右后左的顺序入栈;偶数层从右往左的顺序打印,即结点入栈新的时候按照先左后右的顺序入栈。
- 遍历ltr栈,获取当前层次的结点值打印,并不断将ltr栈顶元素的子树按照先左子树后右子树的顺序放入rtl栈内,直到ltr栈空,即当前奇数层次遍历完成,遍历得到的数值集合放入结果集;
- 遍历rtl栈,获取当前层次的结点值,并不断将rtl栈顶元素的子树按照先右子树后左子树的顺序放入ltr栈内,直到rtl栈空,即当前偶数层次遍历完成,遍历得到的数值集合放入结果集;
/*
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) return result;
TreeNode* curNode=pRoot;
stack<TreeNode*> ltr,rtl;
ltr.push(curNode);
vector<int> tmp;
while(!ltr.empty() || !rtl.empty()){
while(!ltr.empty()){
curNode=ltr.top();
ltr.pop();
tmp.push_back(curNode->val);
if(curNode->left) rtl.push(curNode->left);
if(curNode->right) rtl.push(curNode->right);
}
if(!tmp.empty()){
result.push_back(tmp);
tmp.clear();
}
while(!rtl.empty()){
curNode=rtl.top();
rtl.pop();
tmp.push_back(curNode->val);
if(curNode->right) ltr.push(curNode->right);
if(curNode->left) ltr.push(curNode->left);
}
if(!tmp.empty()) {
result.push_back(tmp);
tmp.clear();
}
}
return result;
}
};
网友评论