请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
方法和从上往下打印二叉树类似,遍历顺序是从上到下,每一行按照从左到右的顺序进行遍历,但是需要增加一个参数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;
}
};
根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空
以如下二叉树为例:
8
/ \
6 10
/ \ / \
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;
}
};