题目:
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
可以用优先广度搜索(BFS)和堆栈或栈来实现。首先用建立一个queue用来存储和搜索。把根节点放入。随后在这个queue没空的情况下,以当前queue的长度(层数)为循环条件,对里面的节点进行检查,如果左右节点不为空,放入queue中。并把当前最顶层的节点的值放入当前结果的数列 temp中。因为会将当前层里的节点都遍历一遍,所以这个算法是可行的。最后根据情况对数列进行翻转并放入结果里
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
queue<TreeNode*> subVectors;
vector<vector<int>> res;
int turn = 1;
if (root == nullptr)
{
return res;
}
subVectors.push(root);
while (!subVectors.empty())
{
vector<int> temp;
int n = subVectors.size();
for (int i=0; i<n; i++)
{
TreeNode* cur = subVectors.front();
subVectors.pop();
temp.push_back(cur->val);
if (cur->left!=nullptr)
{
subVectors.push(cur->left);
}
if (cur->right != nullptr)
{
subVectors.push(cur->right);
}
}
if (turn == -1)
{
reverse(temp.begin(), temp.end());
}
res.push_back(temp);
turn *= -1;
}
return res;
}
};
结果:
33 / 33 test cases passed. | Status: Accepted |
Runtime: 12 ms Memory Usage: 11.9 MB |
参考: