leetcode 662.二叉树最大宽度

这个东西真的好难,已经搞了快两天了,但是这个代码基本上是自己写不出来的,唉~仅仅只是靠着题解过日子了。

当我在看这个题目的时候,必将有一个更加好的题解,记得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;
    }

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值