Leetcode:103. 二叉樹的鋸齒形層次遍歷
阿新 • • 發佈:2018-11-13
給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。
例如:
給定二叉樹 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回鋸齒形層次遍歷如下:
[ [3], [20,9], [15,7] ]
解題思路:
解題的大致思路是廣度優先搜尋的思路,但有點小小的改動。按題目意思,奇數行順序訪問(從左往右),偶數行逆序訪問(從右往左)。二叉樹的訪問,如果是順序訪問,如果要保證孩子的順序不亂,那麼應該先儲存左孩子(left),再儲存右孩子(right);相反,如果是逆序訪問,如果要保證孩子的順序不亂,那麼應該先儲存右孩子(right),再儲存左孩子(left);隨後再考慮訪問孩子的先後順序,觀察可發現,每一層都是先儲存的值後訪問,很顯然應該用(棧)Stack儲存孩子節點。
另外,發現做二叉樹的題,本題除錯不太方便,需要將[3,9,20,null,null,15,7]轉變成二叉樹,於是又編寫了個整型陣列轉二叉樹的函式,本次也算是買一贈一。
class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { if (root == NULL) return{}; vector<vector<int>> res = {}; vector<int> INT = {}; stack<TreeNode*> S,S_temp; S.push(root); int sgn = 1; TreeNode* temp; while (!S.empty()) { INT = {}; int size = S.size(); while (!S_temp.empty()) S_temp.pop(); for (int i = 1; i <= size; i++) { if (sgn % 2 == 1) { temp = S.top(); if (temp != NULL) { INT.push_back(temp->val); S_temp.push(temp->left); S_temp.push(temp->right); } } else { temp = S.top(); if (temp != NULL) { INT.push_back(temp->val); S_temp.push(temp->right); S_temp.push(temp->left); } } S.pop(); } S = S_temp; sgn++; if (int(INT.size()) > 0) { res.push_back(INT); } } return res; } }; |
TreeNode* Int2Tree(vector<int> data) { TreeNode* root; int size = data.size(), pos = 1; if (size == 0) root = NULL; root = new TreeNode(data[0]); queue<TreeNode*> Q; TreeNode* temp; Q.push(root); while (pos < size) { if (!Q.empty()) { temp = Q.front(); if (data[pos] != NULL) { temp->left = new TreeNode(data[pos]); Q.push(temp->left); } if ((pos + 1 < size) && data[pos + 1] != NULL) { temp->right = new TreeNode(data[pos + 1]); Q.push(temp->right); } Q.pop(); } pos += 2; } return root; } |