目录
前言
一、递归基本介绍
递归只要记住三点内容:
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;
}
总结
二叉树知识还不熟练,继续。