1. 程式人生 > >59、劍指offer--按之字形順序打印二叉樹

59、劍指offer--按之字形順序打印二叉樹

print 題目 一個棧 wrap offer 二叉 原因 treenode 只有一個

題目描述 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。 解題思路:通過分析,使用棧進行存儲結點 打印1時,將結點2 3 放入棧中,打印3時,將3的左右孩子67分別放入棧中想放入7 再放6. 通過舉例分析,對於父結點在偶數行,先放入右子結點、再放入左子結點(棧2),對於父結點在奇數行,先放入左子結點再放入右子結點(棧1)。因此使用兩個棧進行存儲。 使用兩個棧的原因,例如2 3 都在棧中,彈出3,需要將其子結點入棧,如果只有一個棧入棧,則之後會先彈出3的子結點,再彈出2,因此,一層存入一個棧中。
 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };
10 */
11 class Solution {
12 public:
13     vector<vector<int> > Print(TreeNode* pRoot) {
14         vector<vector<int
> > result; 15 vector<int> temp;//每一行的間接變量 16 if(pRoot == NULL) 17 return result; 18 stack<TreeNode *> levels[2];//0存奇數行,1存偶數行 19 int current = 0; 20 int next = 1; 21 levels[current].push(pRoot); 22 while(!levels[0].empty() || !levels[1
].empty()) 23 { 24 TreeNode *pNode = levels[current].top(); 25 levels[current].pop(); 26 temp.push_back(pNode->val); 27 if(current == 0)//奇數行,先存左子結點,再存右子結點 28 { 29 if(pNode->left != NULL) 30 levels[next].push(pNode->left); 31 if(pNode->right != NULL) 32 levels[next].push(pNode->right); 33 } 34 else//偶數行,先存右子結點,再存左子結點 35 { 36 if(pNode->right != NULL) 37 levels[next].push(pNode->right); 38 if(pNode->left != NULL) 39 levels[next].push(pNode->left); 40 } 41 if(levels[current].empty())//換行 42 { 43 result.push_back(temp); 44 temp.clear();//每行存入完記得清空 45 current = 1 - current; 46 next = 1- next; 47 } 48 } 49 return result; 50 } 51 };

59、劍指offer--按之字形順序打印二叉樹