题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
方法一
方法和从上往下打印二叉树类似,遍历顺序是从上到下,每一行按照从左到右的顺序进行遍历,但是需要增加一个参数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; } };