目录
N叉树的层序遍历
二叉树的锯齿形层序遍历
二叉树最大宽度
在每个树行中找最大值
N叉树的层序遍历
题目
思路
使用队列+层序遍历来解决这道题,首先判断根节点是否为空,为空则返回空的二维数组;否则,就进行层序遍历,将每层节点依次取出,放入到二维数组中,并将取出的节点的孩子依次添加到队列中,最后返回二维数组。
代码
class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;queue<Node*> q;if(root==nullptr) return ret;q.push(root);while(!q.empty()){int sz=q.size();vector<int> v;while(sz--){Node* tp=q.front();q.pop();v.push_back(tp->val);for(Node* child:tp->children)if(child!=nullptr) q.push(child);}ret.push_back(v);}return ret;}
};
二叉树的锯齿形层序遍历
题目
思路
使用队列+层序遍历来解决这道题,不过需要对偶数层的结果进行逆置,可以使用一个变量来记录当前层的层数,或者使用一个布尔变量来记录当前层是否是偶数层,将每层节点依次取出,如果当前层是偶数层,需要先将数组进行逆置,然后再将数组放入到二维数组中,并将取出的节点的孩子依次添加到队列中,最后返回二维数组。
代码
class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ret;if(root==nullptr) return ret;queue<TreeNode*> q;q.push(root);bool flag=false;while(!q.empty()){int sz=q.size();vector<int> v;while(sz--){TreeNode* node=q.front();q.pop();v.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}if(flag) reverse(v.begin(),v.end());ret.push_back(v);flag=!flag;}return ret;}
};
二叉树最大宽度
题目
思路
首先我们可能会想到下面的方法,将空节点也加入到队列中,然后统计每一次一层非空节点之间空节点的数量,然后+2就是二叉树该行的最大宽度,但是这道题有可能是第二张图那种倒V型,这样就会导致我们队列存储的节点数量非常之多,因此这种方法看起来可行,但实际上是行不通的。
我们可能会想到对每个节点进行编号(受使用数组建堆的启发),根节点的编号可以从0开始也可以从1开始,虽然编号可能会溢出,但是差值是正确的,但是如果我们使用int来存储,溢出时会报错,因此我们使用unsigned int来存储宽度,解法依旧是使用队列+层序遍历,步骤和前几道题是一样的。
代码
class Solution {
public:int widthOfBinaryTree(TreeNode* root) {vector<pair<TreeNode*,unsigned int>> q;q.push_back({root,1});unsigned int ret=0;while(!q.empty()){auto [a,b]=q[0];auto [c,d]=q.back();ret=max(ret,d-b+1);vector<pair<TreeNode*,unsigned int>> v;for(auto [x,y]:q){if(x->left) v.push_back({x->left,2*y});if(x->right) v.push_back({x->right,2*y+1});}q=v;}return ret;}
};
在每个树行中找最大值
题目
思路
使用队列+层序遍历来解决这道题,步骤和前几道题是一样的,无非是在遍历每一层时,将每一层的最大值记录下来,最后返回数组。
代码
class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ret;if(root==nullptr) return ret;queue<TreeNode*> q;q.push(root);while(!q.empty()){int sz=q.size();vector<int> v;while(sz--){TreeNode* node=q.front();q.pop();v.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}ret.push_back(*max_element(v.begin(),v.end()));}return ret;}
};