
目录
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;
    }
};

















