给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回锯齿形层次遍历如下:
[ [3], [20,9], [15,7] ]
解答(C++):
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: //迭代法 void addVec(TreeNode* root, int level, vector<vector<int>> &vvec) { if (root == NULL) return; if (level == vvec.size()) vvec.resize(level+1); if (level % 2 == 0) { vvec[level].push_back(root->val); } else { vvec[level].insert(vvec[level].begin(), root->val); } addVec(root->left, level+1, vvec); addVec(root->right, level+1, vvec); } vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> res; //迭代法 //addVec(root, 0, res); //BFS if (root == NULL) return {}; //保存当前层级节点 std::queue<TreeNode*> q; q.push(root); int level = 0; while (!q.empty()) { vector<int> curVec; int count = q.size(); while (count--) { TreeNode* node = q.front(); q.pop(); if (level % 2 == 0){ curVec.push_back(node->val); } else { curVec.insert(curVec.begin(),node->val); } if (node->left) q.push(node->left); if (node->right) q.push(node->right); } res.push_back(curVec); level++; } return res; } };