题意:


方法一:
bfs

思路:
        层次遍历。
        核心:为每个节点都赋值个id。(例:已知当前父节点的id,则左儿子为id*2,右儿子为id*2+1。)
        利用队列实现一层一层的遍历树,计算每一层的宽度=每一层的最大值id与最小值id的差值+1。
        并且维护每层的宽度值,即可得树的宽度值。



class Solution {
public:
    
    int widthOfBinaryTree(TreeNode* root) {
        if(root==nullptr)
            return 0;
        int res=0;//最大宽度
        queue<pair<TreeNode*,int>> q;//队列
        q.push({root,1});//根节点入队列
        while(!q.empty()){//队列非空
            int cnt=q.size();
            int ma=0,mi=INT_MAX;
            while(cnt--){//一层一层的遍历
                auto t=q.front();
                q.pop();
                TreeNode *p=t.first;
                int id=t.second;
                ma=max(ma,id);//维护id的最大值
                mi=min(mi,id);//维护id的最小值
                if(p->left){
                    q.push({p->left,id*2});//左儿子入队列
                }
                if(p->right){
                    q.push({p->right,id*2+1});//右儿子入队列
                }
            }
            res=max(res,ma-mi+1);//维护最大宽度
        }
        return res;
    }
};


时间复杂度:
空间复杂度:

方法二:
dfs

思路:
        dfs。
        核心:为每个节点都赋值个id。(例:已知当前父节点的id,则左儿子为id*2,右儿子为id*2+1。)
   
        初始化mi[ ]表示不同深度的id的最小值,ma[ ]表示不同深度的id的最大值;
        利用深度优先搜索遍历每个节点,维护不同深度的id最小值和id最大值。
        最后,计算不同深度的id最小值与最大值的差值,得到不同层的宽度,并维护宽度的最大值。

        
class Solution {
public:
    int mi[10005]={0};//mi[]表示不同深度的id的最小值
    int ma[10005]={0};//ma[]表示不同深度的id的最大值
    int maDepth=0;//最大深度
    int widthOfBinaryTree(TreeNode* root) {
        if(root==nullptr)
            return 0;
        memset(mi,0x3f,sizeof(mi));
        dfs(root,1,1);//递归
        int res=0;//最大宽度
        for(int i=1;i<=maDepth;i++){//维护树的最大宽度
//             cout << mi[i] << " " << ma[i] << " " << (ma[i]-mi[i]+1) << endl;
            res=max(res,ma[i]-mi[i]+1);
        }
        return res;
    }
    
    void dfs(TreeNode *root,int id,int dep){
        if(root==nullptr)
            return;
        maDepth=max(maDepth,dep);
        mi[dep]=min(mi[dep],id);//维护最小值
        ma[dep]=max(ma[dep],id);//维护最大值
        if(root->left){
            dfs(root->left,id*2,dep+1);//递归左儿子
        }
        if(root->right){
            dfs(root->right,id*2+1,dep+1);//递归右儿子
        }
    }
};

时间复杂度:
空间复杂度: