微軟面試題: LeetCode 103. 二叉樹的鋸齒形層次遍歷 middle 出現次數:3

題目描述:css

103. 二叉樹的鋸齒形層次遍歷

分析:node

  本題考察的是二叉樹的層次遍歷思想。二叉樹的層次遍歷須要藉助一個隊列輔助 。算法框架以下:算法

 1 void levelOrderTraverse(TreeNode* root)
 2 {
 3     queue<TreeNode*> q;
 4     //初始狀態,先將根節點入隊
 5     q.push(root);
 6     while(!q.empty())
 7     {
 8         //取出隊頭的節點(最先入隊的)訪問(操做),並從隊列中拿出
 9         TreeNode* node = q.top();
10         visit(node);
11         q.pop();
12         //對出隊節點的左右子節點入隊列
13         if(node->left) q.push(node->left);
14         if(node->right) q.push(node->right);
15     }
16     //隊空跳出 while loop,二叉樹的全部元素已經訪問完畢
17     return ;
18 }

 本題考查的是對上面標準二叉樹層次遍歷框架的使用!框架

  以root 節點爲二叉樹的第 1 層,對二叉樹鋸齒形層次遍歷 就是對單層的節點從前日後,對雙層的節點從後往前。oop

  初始狀態:將根節點入隊,隊列中只有一個根節點,即隊列中保存的是第一層的所有節點,隊列的大小就是第一層節點的節點數。spa

此時的層數 level = 1 ;code

      每次遍歷完某一層的全部節點並將其pop出隊列的同時也將下一層的全部節點都 push 到隊列中了 ;blog

  使用一個雙端隊列 deque ,在遍歷處理某一層的全部節點時,如是奇數層 全都 push_back 到deque 中,如果偶數層 隊列

全都 push_front 到 deque 中。
     算法的時間複雜度是 O(n) 空間複雜度 O(n)
具體看下面的代碼和註釋:
 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 
11 class Solution {
12 public:
13 //二叉樹的層次遍歷
14     vector<vector<int>> zigzagLevelOrder(TreeNode* root)
15     {
16         //特殊狀況處理
17         vector<vector<int>> res;
18         if(root == NULL) return res;
19         //二叉樹層次遍歷的輔助
20         queue<TreeNode*> q;
21         //狀態初始化:層數爲1 ,隊列中有第一層的全部節點,
22         q.push(root);
23         int level = 1;//層數
24         /*最外層循環:隊列未空表示 隊列中的節點尚未遍歷處理到,且其可能的子節點(下一層節點),還未入隊。
25                     隊列空了:二叉樹全部節點都已經遍歷處理 */
26         while(!q.empty())
27         {
28            // vector<int> tmp_vec;
29             deque<int> tmp_deq;//使用deque是由於 deque 的push_front 比 vector的insert更高效
30             int q_len = q.size();//當前層的節點個數
31             while(q_len--)//當前層節點都遍歷完出棧後,下一層的節點也所有入棧了
32             {
33                 TreeNode* node = q.front();
34                 q.pop();
35                 if(level%2 == 0)//偶數層須要正序序列,直接插入deque尾部
36                 {
37                   //  tmp_vec.insert(tmp_vec.begin(),node->val);
38                   tmp_deq.push_front(node->val); //deque 的push_front 比 vector的insert更高效
39                 }
40                 else  //奇數層須要逆序序列,頭插法依次插入deque頭部
41                 {
42                     //tmp_vec.push_back(node->val);
43                     tmp_deq.push_back(node->val);
44                 }
45                 if(node->left)
46                 {
47                     q.push(node->left);
48                 }
49                 if(node->right)
50                 {
51                     q.push(node->right);
52                 }
53             }
54             //將當前層的遍歷結果 push_back 到 res
55            // res.push_back(tmp_vec);
56            res.push_back(vector<int>(tmp_deq.begin(), tmp_deq.end()));
57            //遍歷處理下一層節點
58            ++level;
59         }
60         return res;
61     }
62 };
相關文章
相關標籤/搜索