【劍指offer】之字形打印二叉樹,C++實現


原創文章,轉載請注明出處!

本題牛客網地址

博客文章索引地址

博客文章中代碼的github地址

1.題目

      請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。

例如:

輸入二叉樹


劍指Offer(五十九):按之字順序打印二叉樹

輸出順序

1

3 2

4 5 6 7

15 14 13 12 12 10 9 8


2.思路

      本題使用兩個棧作為輔助容器。打印某一層節點時,把下一層的子節點保存到棧內。如果當前打印的是奇數層,則先保存左子樹節點再保存右子樹節點到第一個棧內;如果當前打印的是偶數層,則先保存右子樹在保存左子樹節點到第二個棧內。

http://cuijiahua.com/wp-content/uploads/2018/01/basis_59_2.png

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 };


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM