1. 程式人生 > >劍指Offer——按之字形順序打印二叉樹

劍指Offer——按之字形順序打印二叉樹

打印二叉樹 sta cnblogs 我們 pre 方便 pri == stack

題目描述:

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


分析:

我們都知道二叉樹的層次遍歷用的是隊列。

但是這個的子樹的結點是先進後出的,所以我們使用棧更加方便。

而且為了方便,我用了兩個棧,因為不是每一次都是先進左子樹再進右子樹的。


代碼:

 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> > res; 15 if(pRoot == NULL) return res; 16 stack<TreeNode*> s1, s2; 17 s1.push(pRoot);
18 while(1) { 19 vector<int> v1; 20 while(!s1.empty()) { 21 TreeNode* top = s1.top(); 22 v1.push_back(top->val); 23 if(top->left) s2.push(top->left); 24 if(top->right) s2.push(top->right);
25 s1.pop(); 26 } 27 res.push_back(v1); 28 if(s2.empty()) break; 29 vector<int> v2; 30 while(!s2.empty()) { 31 TreeNode* top = s2.top(); 32 v2.push_back(top->val); 33 if(top->right) s1.push(top->right); 34 if(top->left) s1.push(top->left); 35 s2.pop(); 36 } 37 res.push_back(v2); 38 if(s1.empty()) break; 39 } 40 return res; 41 } 42 };

劍指Offer——按之字形順序打印二叉樹