【每日刷题】Day63

【每日刷题】Day63

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 414. 第三大的数 - 力扣(LeetCode)

2. 2265. 统计值等于子树平均值的节点数 - 力扣(LeetCode)

3. 1302. 层数最深叶子节点的和 - 力扣(LeetCode)

1. 414. 第三大的数 - 力扣(LeetCode)

//思路:排序+遍历。将数组排为升序后进行双指针遍历,使用一个flag遍历判断是否遍历到第三大数或是否有第三大数,两个指针指向元素不相同flag++,当flag==3时说明遍历到了第三大数,break;当走出循环后flag!=3,说明没有第三大数,返回最大的数

//插入排序

void InsertSort(int* arr,int size)

{

    for (int i = 0; i < size-1; i++)

    {

        int end = i + 1;

        int tmp = arr[end];

        while (end - 1 >= 0)

        {

            if (tmp > arr[end - 1])

            {

                arr[end] = arr[end - 1];

            }

            else

            {

                break;

            }

            end--;

        }

        arr[end] = tmp;

    }

}



 

//希尔排序

void ShellSort(int* arr, int size)

{

    int gap = size;

    while (gap > 1)

    {

        gap = gap / 3 + 1;

        for (int i = 0; i < size - gap; i++)

        {

            int end = i + gap;

            int tmp = arr[end];

            while (end - gap >= 0)

            {

                if (tmp > arr[end - gap])

                {

                    arr[end] = arr[end - gap];

                }

                else

                {

                    break;

                }

                end -= gap;

            }

            arr[end] = tmp;

        }

    }

    InsertSort(arr, size);

}

int thirdMax(int* nums, int numsSize)

{

    ShellSort(nums,numsSize);//排序

    int flag = 1;

    double ans = 0;

    for(int i = 0;i<numsSize-1;i++)

    {

        if(nums[i]!=nums[i+1])//遇到不相同的数

            flag++;

        if(flag==3)

        {

            ans = nums[i+1];

            break;

        }

    }

    if(flag!=3)

        ans = nums[0];

    return (int)ans;

}

2. 2265. 统计值等于子树平均值的节点数 - 力扣(LeetCode)

//思路:深度优先遍历。把每一个根节点看为一棵树,求出该根节点左右子树节点个数以及左右子树结点值的和,计算平均值,判断是否为当前结点的值。

//求树的节点个数

int BinaryTreeTreeSize(struct TreeNode* root)

{

    if (root == NULL)

        return 0;

    return 1 + BinaryTreeTreeSize(root->left) + BinaryTreeTreeSize(root->right);

}

int _averageOfSubtree(struct TreeNode* root,int* ans)

{

    if(!root)

        return 0;

    int left = _averageOfSubtree(root->left,ans);//左子树结点值的和

    int right = _averageOfSubtree(root->right,ans);//右子树结点值的和

    int num = BinaryTreeTreeSize(root);//求出该树节点个数

    if((left+right+root->val)/num==root->val)//判断平均值是否=root->val

        (*ans)++;

    return left+right+root->val;//返回当前子树结点值的和

}


 

int averageOfSubtree(struct TreeNode* root)

{

    int ans = 0;

    _averageOfSubtree(root,&ans);

    return ans;

}

3. 1302. 层数最深叶子节点的和 - 力扣(LeetCode)

//思路:深度优先遍历。求出二叉树最大深度,遍历二叉树,当遇到叶子结点时判断其是否是最深的叶子节点。是,则让结果+=root->val;不是,则直接返回,如果遍历到空,也返回。

//二叉树最大深度

int BinaryTreeHigh(struct TreeNode* root)

{

    if(!root)

        return 0;

    int left = BinaryTreeHigh(root->left);

    int right = BinaryTreeHigh(root->right);

    return 1+(left>right?left:right);

}


//判断是否为叶子节点

bool IsLeafNode(struct TreeNode* root)

{

    return !root->left&&!root->right;

}

void _deepestLeavesSum(struct TreeNode* root,int high,int* ans)

{

    if(!root||(IsLeafNode(root)&&high!=1))//如果遍历到NULL或不是最深的叶子结点,直接返回

        return;

    if(IsLeafNode(root)&&high==1)//是最深的叶子节点,结果+=root->val

        (*ans)+=root->val;

    _deepestLeavesSum(root->left,high-1,ans);

    _deepestLeavesSum(root->right,high-1,ans);

}

int deepestLeavesSum(struct TreeNode* root)

{

    int high = BinaryTreeHigh(root);

    int ans = 0;

    _deepestLeavesSum(root,high,&ans);

    return ans;

}

  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值