给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [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; } |