題目:請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
1 | ||||||||
2 | 3 | |||||||
4 | 5 | 6 | 7 | |||||
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
以該二叉樹爲例,按之字形輸出應爲:1 3,2 4,5,6,7 15,14,13,12,11,10,9,8
打印第二層(偶數層)的時候,是從右向左打印,看起來節點是先入後出的,可以用棧結構實現,先把左子節點壓入棧,再把右子節點壓入棧;第三層(奇數層)的時候,是從左到右打印,所以在用棧結構存儲子節點的時候,應該是在輸出節點3的時候,把節點3的子節點按照先右後左的順序存到棧結構中(在3出棧的時候子節點同時入棧,所以需要兩個棧結構),輸出節點2的時候,把節點2的子節點按照先右後左的順序存到棧結構中;以此類推。
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> result;
if(pRoot == nullptr)
return result;
stack<TreeNode*> stackOdd;
stackOdd.push(pRoot);
//stackEven用來存儲偶數層
stack<TreeNode*> stackEven;
while(!stackOdd.empty() || !stackEven.empty()){
if(!stackOdd.empty()){
vector<int> temp;
while(!stackOdd.empty()){
TreeNode* data = stackOdd.top();
stackOdd.pop();
temp.push_back(data->val);
if(data->left != nullptr){
stackEven.push(data->left);
}
if(data->right != nullptr){
stackEven.push(data->right);
}
}
result.push_back(temp);
}
if(!stackEven.empty()){
vector<int> temp;
while(!stackEven.empty()){
TreeNode* data = stackEven.top();
stackEven.pop();
temp.push_back(data->val);
if(data->right != nullptr){
stackOdd.push(data->right);
}
if(data->left != nullptr){
stackOdd.push(data->left);
}
}
result.push_back(temp);
}
}
return result;
}
};