首页 > 其他分享 >[LeetCode] 662. 二叉树最大宽度

[LeetCode] 662. 二叉树最大宽度

时间:2024-10-14 21:49:31浏览次数:3  
标签:right TreeNode int 662 节点 二叉树 null LeetCode left

题目描述:

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。

树的 最大宽度 是所有层中最大的 宽度 。

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在  32 位 带符号整数范围内。

示例 1:

输入:root = [1,3,2,5,3,null,9]
输出:4
解释:最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9) 。

示例 2:

输入:root = [1,3,2,5,null,null,9,6,null,7]
输出:7
解释:最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7) 。

示例 3:

输入:root = [1,3,2,5]
输出:2
解释:最大宽度出现在树的第 2 层,宽度为 2 (3,2) 。

提示:

  • 树中节点的数目范围是 [1, 3000]
  • -100 <= Node.val <= 100

题目链接:

. - 力扣(LeetCode)

解题主要思路:

一开始我是想用队列直接硬解,但是如果这条树每层只有最左节点和最右节点,会报错,因为内存占用太大了。后来想到,我们可以根据二叉树的特性,如果一个节点的下标为x,那么它的左右节点的下标分别为2x和2x+1。不过需要注意的是,我们需要用unsigned int来存下标的数值,因为c语言的数据存储可以看作是一个环形的存储,即使过了数据范围也无伤大雅,因为题目说了 “题目数据保证答案将会在  32 位 带符号整数范围内”,最右边节点的下标和最左边下标的差值在int的范围内,至于用unsigned是因为在leetcode中,带符号的数值类型超了范围会报错。

解题代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        // 数组模拟队列, 用unsigned int来计算,因为int过了数据范围会报错
        vector<pair<TreeNode*, unsigned int>> que;
        que.push_back(make_pair(root, 1));
        unsigned int ret = 0;
        while (que.size()) {
            vector<pair<TreeNode*, unsigned int>> tmp;
            auto& [x1, y1] = que[0];
            auto& [x2, y2] = que.back();
            ret = max(ret, y2-y1+1);
            // 将下一层入队列
            for (auto& [x, y] : que) {
                if (x->left) tmp.push_back(make_pair(x->left, 2*y));
                if (x->right) tmp.push_back(make_pair(x->right, 2*y+1));
            }
            que = tmp;
        }
        return ret;
    }
};

标签:right,TreeNode,int,662,节点,二叉树,null,LeetCode,left
From: https://blog.csdn.net/weixin_65043441/article/details/142929463

相关文章

  • 代码随想录算法训练营day15| 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和
    学习资料:https://programmercarl.com/0110.平衡二叉树.html#算法公开课平衡二叉树:任意一个节点的左右子树高度差不超过1左叶子:是叶子节点,且是其父节点的左节点完全二叉树:上层均满,底层的节点从左到右连续满二叉树:每层都是满的,节点总数为(2^k+1)语法:2<<1是2^2学习记录:1......
  • 算法训练15-1判断平衡二叉树+二叉树的所有路径
    题目1:给定一个二叉树,判断它是否是 平衡二叉树  解法主要考察高度,后序遍历->需要递归法->递归法三步走/** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNod......
  • Leetcode_exercise_01
    题目两数之和枚举所有可能的两个不同的数字之和,与target做比较。哈希表查询//方法一:classSolution{public:vector<int>twoSum(vector<int>&nums,inttarget){intn=nums.size();for(inti=0;i<n;++i){......
  • (nice!!!)(LeetCode) 1884. 鸡蛋掉落-两枚鸡蛋(动态规划 dfs递归和递推 || 数学)
    题目:1884.鸡蛋掉落-两枚鸡蛋方法一:动态规划dp+递归dfs+记忆化搜索。时间复杂度0(n^2)。C++版本:classSolution{public: //状态sta[i]表示:i层找到f所需要的最小操作次数intsta[1010];inttwoEggDrop(intn){ //层数为0时,直接返回0if(n==0......
  • 闯关leetcode——94. Binary Tree Inorder Traversal
    大纲题目地址内容解题代码地址题目地址https://leetcode.com/problems/binary-tree-inorder-traversal/description/内容Giventherootofabinarytree,returntheinordertraversalofitsnodes’values.Example1:Input:root=[1,null,2,3]Outpu......
  • 闯关leetcode——100. Same Tree
    大纲题目地址内容解题代码地址题目地址https://leetcode.com/problems/same-tree/description/内容Giventherootsoftwobinarytreespandq,writeafunctiontocheckiftheyarethesameornot.Twobinarytreesareconsideredthesameifthey......
  • 【LeetCode Hot 100】31. 下一个排列
    https://leetcode.cn/problems/next-permutation/description/这里下个排列的意思是按字典序的排列,C++STL中算法默认也是按照字典序排列来操作。C++STL中提供了对应的接口next_permutation,下面记录一下力扣给的题解,这种方法允许数据重复,据说STL也是采用的这种方法。从后向前......
  • 带中位数写法的快速排序再讨论 & leetcode 215. Kth Largest Element in an Array题解
    带中位数写法的快速排序再讨论&leetcode215.KthLargestElementinanArray题解 探讨带中位数的写法本身classSolution{public:intfindKthLargest(std::vector<int>&nums,intk){returnfakeQuickSort(nums,k,0,nums.size()-1);}privat......
  • Leetcode 贪心算法之Largest Number
    题目描述给定一组非负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。实例示例1:输入:nums=[10,2]输出:“210”示例2:输入:nums=[3,30,34,5,9]输出:“9534330”思路分析利用贪......
  • [LeetCode] 315. 计算右侧小于当前元素的个数
    题目描述:给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。题目链接:.-力扣(LeetCode)题目主要思路:其实跟“LCR170.交易逆序对的总数”那道题差不多,就是多了个数组来......