429. N 叉树的层序遍历
429. N 叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(拜见示例)。
示例 1:
- 输入:root = [1,null,3,2,4,null,5,6]
- 输出:[[1],[3,2,4],[5,6]]
复制代码 示例 2:
- 输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
- 输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
复制代码 提示:
- 树的高度不会凌驾 1000
- 树的节点总数在 [0, 10^4] 之间
解题思路:队列 + 广度搜索
这道题实在就是 二叉树的层序遍历 的变形,只不过将其左右孩子改成了一个数组来存放孩子节点罢了,我们只需要遍历一下数组即可,其它思路都是一样的,就是使用队列的先进先出特点,每次处理一层,然后根据队列的元素个数控制每层遍历d
- /*
- // Definition for a Node.
- class Node {
- public:
- int val;
- vector<Node*> children;
- Node() {}
- Node(int _val) {
- val = _val;
- }
- Node(int _val, vector<Node*> _children) {
- val = _val;
- children = _children;
- }
- };
- */
- class Solution {
- public:
- vector<vector<int>> levelOrder(Node* root) {
- if(root == nullptr)
- return {};
-
- vector<vector<int>> vv; // 结果集
- queue<Node*> qe; // 队列,存放的是树的节点
- qe.push(root);
- while(!qe.empty())
- {
- int n = qe.size();
- vector<int> v;
- for(int i = 0; i < n; ++i)
- {
- Node* front = qe.front();
- qe.pop();
- v.push_back(front->val);
- for(int j = 0; j < front->children.size(); ++j) // 将当前节点的所有子节点入队列
- qe.push(front->children[j]);
- }
- vv.push_back(v); // 别忘了尾插到结果集中
- }
- return vv;
- }
- };
复制代码 103. 二叉树的锯齿形层序遍历
103. 二叉树的锯齿形层序遍历
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间瓜代进行)。
示例 1:
- 输入:root = [3,9,20,null,null,15,7]
- 输出:[[3],[20,9],[15,7]]
复制代码 示例 2:
示例 3:
提示:
- 树中节点数目在范围 [0, 2000] 内
- -100 <= Node.val <= 100
解题思路:队列 + 广度搜索
这道题就是 429. N 叉树的层序遍历 的拓展,假设第一层是根节点那层,那么接下来第二层就需要逆序,第三层就不逆序,如果我们直接在遍历节点的时候控制队列中当前节点的孩子节点插入的话,实在是不太好搞,还有另外一个妙招!
因为我们每次都把每层的遍历结果放在一个数组 v 中呀,那我们只需要在每层数组 v 处理完成之后,判定一下当前是奇数层还是偶数层,如果是偶数层的话,我们就把数组 v 逆序一下插入到 vv 中即可,无非就是 429. N 叉树的层序遍历 这道题多加了仅仅三行代码!
- /**
- * 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) {
- if(root == nullptr)
- return {};
- vector<vector<int>> vv;
- queue<TreeNode*> qe;
- qe.push(root);
- int flag = 1; // 规定奇数表示从左向右遍历,偶数从右往左遍历
- while(!qe.empty())
- {
- vector<int> v;
- int n = qe.size();
- for(int i = 0; i < n; ++i)
- {
- TreeNode* front = qe.front();
- qe.pop();
- v.push_back(front->val);
- if(front->left)
- qe.push(front->left);
- if(front->right)
- qe.push(front->right);
- }
-
- // 如果是偶数的话只需要逆序一下数组即可
- if(flag % 2 == 0)
- reverse(v.begin(), v.end());
- vv.push_back(v);
- flag++;
- }
- return vv;
- }
- };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |