LC.662 | 二叉树最大宽度 | 树 | 层序遍历

输入:一棵二叉树的根节点 root

要求:返回这棵二叉树的 最大宽度。宽度定义为:在同一层中,最左非空节点和最右非空节点之间的(逻辑)节点数量。

输出:一个整数,表示最大宽度。


思路:层序遍历 + 给每个节点分配“完全二叉树编号”

把真实二叉树当成一棵“隐式完全二叉树”,这样做的好处是不需要真的补全 null 节点,但能够模拟完整结构,从而正确计算每一层的最左、最右逻辑位置。

按照下面这种方式给节点编号:

  • root 的编号是 1

  • 左孩子编号 = idx * 2

  • 右孩子编号 = idx * 2 + 1

对于某一层,我们记录:

  • start:该层第一个节点的编号

  • end:该层最后一个节点的编号

该层宽度 = end - start + 1,一层一层更新最大值即可。


复杂度:

        时间复杂度:O(n)

        空间复杂度:O(n)


 class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        if (!root) return 0;

        queue<pair<TreeNode*, unsigned long long>> q;
        q.push({root, 1});

        int ans = 0;

        while (!q.empty()) {
            int n = q.size();
            unsigned long long start = 0, end = 0;

            for (int i = 0; i < n; i++) {
                auto [node, idx] = q.front();
                q.pop();

                if (i == 0) start = idx;
                if (i == n - 1) end = idx;

                if (node->left)  q.push({node->left,  idx * 2});
                if (node->right) q.push({node->right, idx * 2 + 1});
            }

            ans = max(ans, (int)(end - start + 1));
        }

        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值