題目描述
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
方法一
方法和從上往下打印二叉樹類似,遍歷順序是從上到下,每一行按照從左到右的順序進行遍歷,但是需要增加一個參數row來標記當前行數,如果是偶數行,則每次將值放入vector的末尾;如果是奇數行,則每次將值插入vector的第一個位置。代碼
/*
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>> res;
if( pRoot == NULL )
return res;
queue<pair<TreeNode*,int>> q;
q.push( make_pair(pRoot,0) );
while( !q.empty() )
{
TreeNode* node = q.front().first;
int row = q.front().second;
q.pop();
if( node == NULL )
continue;
if( res.size() <= row )
{
vector<int> temp;
res.push_back(temp);
}
if( row%2 == 0 )
res[row].push_back( node->val );
else
res[row].insert(res[row].begin(), node->val);
q.push( make_pair(node->left, row+1) );
q.push( make_pair(node->right, row+1) );
}
return res;
}
};
方法二
1 8 2 / \ 3 6 10 4 / \ / \ 5 5 7 9 11
1、首先,建立兩個棧s1和s2,將根節點(8)存入s1中。返回值爲vector<vector<int>> res;
2、然後,將s1中節點(即根節點8)彈出,將8存入res中,然後將其左子節點(6)和右子節點(10)存入s2中,此時s1爲空,s2中元素爲6、10;
3、將s2中的節點彈出,先彈出的節點爲10,後彈出的節點爲6。彈出10時,將10放入res,將其子節點按照先右子節點(11),後左子節點(9)的順序壓入s1;然後彈出節點6,同樣,將6放入res,並將其右子節點(7)和左子節點(5)壓入s1;此時s1中元素爲11、9、7、5;
4、再對s1進行類似操作,可以看出最後一行輸出順序爲5、7、9、11,符合題目要求。直到s1和s2均爲空,說明樹中所有節點已經遍歷完成。
代碼
/*
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>> res;
if( pRoot == NULL )
return res;
stack<TreeNode*> s1;
stack<TreeNode*> s2;
int row = 0;
s1.push( pRoot );
while( !s1.empty() || !s2.empty() )
{
while( !s1.empty() )
{
TreeNode* node = s1.top();
s1.pop();
if( node == NULL )
continue;
if( row >= res.size() )
{
vector<int> temp;
res.push_back(temp);
}
res[row].push_back( node->val );
s2.push(node->left);
s2.push(node->right);
}
row++;
while( !s2.empty() )
{
TreeNode* node = s2.top();
s2.pop();
if( node == NULL )
continue;
if( row >= res.size() )
{
vector<int> temp;
res.push_back(temp);
}
res[row].push_back( node->val );
s1.push(node->right);
s1.push(node->left);
}
row++;
}
return res;
}
};