59、劍指offer--按之字形順序打印二叉樹
阿新 • • 發佈:2017-07-04
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--按之字形順序打印二叉樹