原創文章,轉載請注明出處!
1.題目
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
例如:
輸入二叉樹
輸出順序
1
3 2
4 5 6 7
15 14 13 12 12 10 9 8
本題使用兩個棧作為輔助容器。打印某一層節點時,把下一層的子節點保存到棧內。如果當前打印的是奇數層,則先保存左子樹節點再保存右子樹節點到第一個棧內;如果當前打印的是偶數層,則先保存右子樹在保存左子樹節點到第二個棧內。
3.代碼
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 15 // 存儲結果 16 vector<vector<int> > results; 17 vector<int> rlt_temp; 18 19 // 邊界條件 20 if(pRoot == nullptr) 21 return results; 22 23 // 輔助容器 24 stack<TreeNode*> stk[2]; // stk[0]是奇數層,stk[1]是偶數層 25 int now = 0; 26 int next = 1; 27 TreeNode* temp=pRoot; 28 29 // 根節點入棧 30 stk[now].push(temp); 31 32 // 遍歷兩個棧,當兩個棧均為空時,跳出循環 33 while(!stk[now].empty() || !stk[next].empty()){ 34 // 存儲遍歷結果 35 temp = stk[now].top(); 36 rlt_temp.push_back(temp->val); 37 stk[now].pop(); 38 39 // 當前層是奇數或偶數 40 if(now==0) 41 { 42 // 當前層是奇數時,左子樹先入棧,右子樹后入棧 43 if(temp->left!=nullptr) 44 stk[next].push(temp->left); 45 if(temp->right!=nullptr) 46 stk[next].push(temp->right); 47 } 48 else 49 { 50 // 當前層是偶數時,右子樹先入棧,左子樹后入棧 51 if(temp->right!=nullptr) 52 stk[next].push(temp->right); 53 if(temp->left!=nullptr) 54 stk[next].push(temp->left); 55 } 56 57 // 當前層為空時,打印下一層 58 if(stk[now].empty()) 59 { 60 results.push_back(rlt_temp); 61 rlt_temp.clear(); 62 now=1-now; 63 next = 1-next; 64 } 65 } 66 return results; 67 } 68 };