• C练题笔记之:Leetcode-662. 二叉树最大宽度


    题目:
     

    给你一棵二叉树的根节点 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)
    链接:https://leetcode.cn/problems/maximum-width-of-binary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    结果:

     

    解题思路:

    这题做了挺久,最后想到的还是标记。一开始卡在了标记超出范围了。

    首先很low的搞了个全局变量hashMap,因为题目说明做多3000,所以范围定在了30001(下标从1开始做记录)。里面的第一个元素,用来存储当前层级上最左边的数值。第二个元素存储当前该层级上最大宽度。

    每一层的处理:

            每一层都从1开始重新计数,因为递归传下了上一层为止的总节点数和上一层的节点数,因此很容易计算出当前的这一层第一个数。

            递归参数:

                    root:当前节点

                    beforeSum:上一层为止所有节点数之和。

                    beforNCount:上一层的所有节点数。

                    n:当前层数

                    index:当前节点标记

            节点标记:当前为index,左子节点为 index * 2 ,右子节点为:index * 2 + 1;

            层数:当前为n, 下一层就是 n + 1

            通过inde可以获得当前节点是本层的第几个: index - sum即可获得。(只记录最小的到hashMap[ i ] [ 0 ] 中)

            当前层的最大节点数 = beforeNCount * 2。

    另:需要如果一开始循环全部是右节点,着中国情况下,为了节省index的计算,直接让忽略同一层只有一个的节点。

    最后循环hashMap,去除hashMap[ i ] [ 1 ] 处最大的返回就好了。

    代码:

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * struct TreeNode *left;
    6. * struct TreeNode *right;
    7. * };
    8. */
    9. unsigned int hashMap[3001][2] = {0}; //[min, count]的方式存储每一层最小编号(每一层都从1开始)1和当前层次中的最大宽度
    10. void DfxGetHashMap(struct TreeNode* root, unsigned long long sum, unsigned long long nCount, int n, unsigned long long index)
    11. {
    12. if (root == NULL) {
    13. return;
    14. }
    15. //printf("root->val = %d\n", root->val);
    16. if (hashMap[n][0] == 0) {
    17. hashMap[n][0] = index - sum;
    18. hashMap[n][1] = 1;
    19. } else {
    20. hashMap[n][1] = index - sum - hashMap[n][0] + 1;
    21. }
    22. DfxGetHashMap(root->left, sum + 2 * nCount, nCount * 2, n + 1, index * 2);
    23. DfxGetHashMap(root->right, sum + 2 * nCount, nCount * 2, n + 1, index * 2 + 1);
    24. }
    25. int widthOfBinaryTree(struct TreeNode* root){
    26. int n = 2; // 层数
    27. unsigned long long index = 1; // 编号
    28. unsigned long long sum = 1; // 上一层位置的个数h之合
    29. unsigned long long nCount = 1; // 当前这一层的节点个数(满二叉树的情况下应该有多少个)
    30. struct TreeNode *temp = root;
    31. while (temp->left == NULL && temp->right != NULL) {
    32. temp = temp->right;
    33. }
    34. memset(hashMap, 0, 3000*2*sizeof(int));
    35. hashMap[1][0] = 1;
    36. hashMap[1][1] = 1;
    37. DfxGetHashMap(temp->left, sum, nCount, n, index * 2);
    38. DfxGetHashMap(temp->right, sum, nCount, n, index * 2 + 1);
    39. int max = 0;
    40. for (int i = 1; hashMap[i][0] != 0; i++) {
    41. max = hashMap[i][1] > max ? hashMap[i][1] : max;
    42. }
    43. return max;
    44. }

  • 相关阅读:
    【PyQt5】一文向您详细介绍 self.setLayout() 的作用
    java中为什么只存在值传递(以传入自定义引用类型为例)
    场景中的解剖学方向标记_vtkAnnotatedCubeActor
    一个.Net简单、易用的配置文件操作库
    七、【VUE-CLI】插件
    视觉语言跨模态特征语义相似度计算改进--表征空间维度语义依赖感知聚合算法 ACM MM
    pcb电路板常见的用途有哪些?
    C++笔试题详解+扩展
    后门程序3(补充)
    8K直播如何多路推流到抖音、微博、视频号、B站等平台
  • 原文地址:https://blog.csdn.net/lingjinyue/article/details/126575588