题意:
方法一:
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);//递归右儿子
}
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号