这个东西真的好难,已经搞了快两天了,但是这个代码基本上是自己写不出来的,唉~仅仅只是靠着题解过日子了。
当我在看这个题目的时候,必将有一个更加好的题解,记得B站有一个UP讲的也好,但是自己写不出这个代码,有一点难!好菜啊
尽量把意思写的明白一些,方便自己取看以及去复习,全放在最下边了,那个代码块就是方便自己取随意的取出的,注释基本不在代码块里边。
【数据结构】求二叉树的最大宽度手写代码_哔哩哔哩_bilibili
Leetcode力扣662 手画图解版|二叉树最大宽度 Maximum Width of Binary Tree_哔哩哔哩_bilibili
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
if (root == nullptr)
{
return 0;
}
// 保存最大的宽度
int res = 0;
// 队列用于广度优先遍历
queue<TreeNode*> q;
// 对于根节点的编号为0
root->val = 0;
q.push(root);
while (!q.empty())
{
// 基于目前队列头和尾获得当前层的宽度
res = max(res, q.back()->val - q.front()->val + 1);
// 编号缩小的差值
int offset = q.front()->val;
// 遍历完当前层
int n = q.size();
for (int i = 0; i < n; ++i)
{
TreeNode* curr = q.front();
q.pop();
// 缩小数值
curr->val -= offset;
if (curr->left)
{
// 转换为对应的编号
curr->left->val = curr->val*2;
q.push(curr->left);
}
if (curr->right)
{
// 转换为对应的编号
curr->right->val = curr->val*2+1;
q.push(curr->right);
}
}
}
return res;
}
};
//注意这个是在leetcode 上是过不去的,但是这是我自己可以将就理解的代码了,其他的,难崩!
int widthOfBinaryTree(TreeNode* root) {
//为空直接跳过,搞什么啊 ,避免异常
if (root == nullptr)
{
return 0;
}
// 保存最大的宽度
int res = 0;
// 队列用于广度优先遍历
queue<TreeNode*> q;
// 对于根节点的编号为0
root->val = 0;
q.push(root);
while (!q.empty())
{
// 基于目前队列头和尾获得当前层的宽度
res = max( res , q.back()->val - q.front()->val + 1 );
// 编号缩小的差值,就是改变这个根点的值的意思
int offset = q.front()->val;
//
在C++编程中,`q.front()`通常用于访问队列(queue)类型的容器的第一个元素。这里的“q”应该是一个队列对象。
`q.front()->val`的含义是:
1. `q.front()`:获取队列“q”的第一个元素(即队头元素)的引用或指针。
2. `->val`:如果队头元素是一个具有成员变量“val”的类的对象,那么`->val`就是访问这个对象的“val”成员变量的值。
所以,`int offset = q.front()->val;`这行代码的整体含义是:将队列“q”中第一个元素的“val”成员变量的值赋给整型变量“offset”。
// 遍历完当前层,创建一个变量来计算每一层的宽度,
int n = q.size();
for (int i = 0; i < n; ++i)
{
TreeNode* curr = q.front();
q.pop();
// 缩小数值
curr->val -= offset;
//左子树处理
if (curr->left)
{
// 转换为对应的编号
curr->left ->val = curr->val * 2;
q.push(curr->left);
}
//右子树处理
if (curr->right)
{
// 转换为对应的编号
curr->right ->val = curr->val * 2 + 1 ;
q.push(curr->right);
}
}
}
//返回一下就行了
return res;
}