《Leetcode零基础刷题指南》- 递归

目录

前言

一、递归基本介绍

二、阶乘后的0(传送门)

三、完全二叉树的节点个数(传送门)

总结


前言


一、递归基本介绍

递归只要记住三点内容:

1)你要实现一个函数,这个函数会自己调用自己,并且每次调用,函数传参是不一样的;

2)递归一定要有出口,即满足一定条件后需要return,否则就可能出现死递归(引起栈溢出);

3)根据递推式来补充你的递归调用内容;

二、阶乘后的0(传送门)

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

示例 1:

输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0

🔑思路:

        1.当n <5的时候,由于n!中没有10这个因子,尾部自然是没有零的;

        2.于是,我们发现,问题本质就是求10的因子的数星,而在n!中,2的因子不会少于5。所以其实际求5的因子数量。

        求5的因子数量,我们可以把所有5的倍数(且非25的倍数)找出来,有一个;所有25的倍数(且非625的倍数)找出来,o个;所有125的倍数找出来,个;以此类推,所以,我们令f(n)表示n的5因子数,它就等于;

         转化成公式:

int trailingZeroes(int n){
    if(n < 5) {
        return 0;                         
    }
    return n / 5 + trailingZeroes(n/5);   
}

三、完全二叉树的节点个数(传送门)

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:


输入:root = [1,2,3,4,5,6]
输出:6

🔑思路:

         1.空树的结点数为0;

        2.非空树的结点数为左子树个数+右子树个数+1;

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


int countNodes(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }
    return countNodes(root->left)+countNodes(root->right)+1;
}

四、开幕式焰火(传送门)

「力扣挑战赛」开幕式开始了,空中绽放了一颗二叉树形的巨型焰火。
给定一棵二叉树 root 代表焰火,节点值表示巨型焰火这一位置的颜色种类。请帮小扣计算巨型焰火有多少种不同的颜色。

示例 1:

输入:root = [1,3,2,1,null,2]

输出:3

解释:焰火中有 3 个不同的颜色,值分别为 1、2、3

🔑思路:

        1.将二叉树的当前结点标记;

        2.递归遍历左子树;

        3.递归遍历右子树;

int Hash[1024];

void transfer(struct TreeNode* root) {
    if(root) {
        Hash[root->val] = 1;        // (1)
        transfer(root->left);       // (2)
        transfer(root->right);      // (3)
    }
}
int numColor(struct TreeNode* root){
    int i, sum = 0;
    memset(Hash, 0, sizeof(Hash));
    transfer(root);
    for(i = 1; i <= 1000; ++i) {
        if(Hash[i]) ++sum;
    }
    return sum;
}


总结

        二叉树知识还不熟练,继续。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

penguin_bark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值