《九日集训》第十五轮 (第九讲) 简单递归

知识点

递归

int JieCheng(int n) {
if(n <= 1) {
return 1;
}
return n * JieCheng(n-1);
}

题目分析

题目1

172. 阶乘后的零

分析

本质上是统计5的个数有多少个

代码

class Solution {
public:
vector<int> shuffle(vector<int>& nums, int n) {
vector<int>result;
for(int i=0;i<n;i++){
result.push_back(nums[i]);
result.push_back(nums[i+n]);
}
return result;
}
};

题目2

1342. 将数字变成 0 的操作次数

分析

简单的模拟而已

代码

class Solution {
public:
int numberOfSteps(int num) {
int res=0;
while(num!=0){
if(num%2==0){
num/=2;
res++;
}else{
num--;
res++;
}
}
return res;
}
};

题目3

222. 完全二叉树的节点个数

分析

代码随想录刷过这题,利用完全二叉树的性质来做。如果是满二叉树,节点数直接为 2^树深度 - 1,如果不是满二叉树,则递归左右节点转化为满二叉树计算

代码

/**
* 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 res=0;
int countNodes(TreeNode* root) {
if(root==nullptr)return 0;
TreeNode*left=root->left;
TreeNode*right=root->right;
int leftHight=0,rightHight=0;
while(left){//左子树深度
left=left->left;
leftHight++;
}
while(right){//右子树深度
right=right->right;
rightHight++;
}
if(leftHight==rightHight)return (2<<leftHight)-1;
return countNodes(root->left)+countNodes(root->right)+1;
}
};

题目4

LCP 44. 开幕式焰火

分析

树的遍历,把结果存到set计算set的长度即是答案

代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
set<int>res;
int numColor(TreeNode* root) {
if(root){
numColor(root->left);
numColor(root->right);
res.insert(root->val);
}
return res.size();
}
};

题目5

397. 整数替换

分析

灵感来自于104. 二叉树的最大深度 ,由

  1. 如果 n是偶数,则用 n2替换 n
  2. 如果 n是奇数,则可以用 n+1n1替换n

可以直接写出递归表达式

代码

class Solution {
public:
int integerReplacement(int n) {
if(n==1)return 0;
if(n==2147483647)return 32;
if(n%2==0)return integerReplacement(n/2)+1;
else return min(integerReplacement(n+1),integerReplacement(n-1))+1;
}
};

题目6

938. 二叉搜索树的范围和

分析

将二叉树遍历一下,当结点的值位于区间时就相加

答案

/**
* 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 sum=0;
int rangeSumBST(TreeNode* root, int low, int high) {
if(root==nullptr)return 0;
if(root->val>=low && root->val<=high)sum+=root->val;
rangeSumBST(root->left,low,high);
rangeSumBST(root->right,low,high);
return sum;
}
};

题目7

剑指 Offer 55 - I. 二叉树的深度

分析

104. 二叉树的最大深度 一毛一样

代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==nullptr)return 0;
return max(maxDepth(root->left),maxDepth(root->right))+1;
}
};

题目8

104. 二叉树的最大深度

分析

代码随想录上刷过这题qwq,整体最大深度其实是左子树和右子树中的最大的那个深度

代码

/**
* 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 maxDepth(TreeNode* root) {
if(root==nullptr)return 0;
return max(maxDepth(root->left),maxDepth(root->right))+1;
}
};

题目9

226. 翻转二叉树

分析

代码随想录上刷过,把每一个节点的左右子树交换一下就可以了。

代码

/**
* 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:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr)return root;
swap(root->right,root->left);
invertTree(root->left);
invertTree(root->right);
return root;
}
};

题目10

797. 所有可能的路径

分析

直接dfs一下即可

代码

class Solution {
public:
int n;
vector<vector<int>> res;//结果
vector<int>road;//路径
void dfs(int u,vector<vector<int>>& graph){
road.push_back(u);
if(u==n-1)res.push_back(road);
for(auto x:graph[u])dfs(x,graph);
//回溯
road.pop_back();
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
n=graph.size();
dfs(0,graph);
return res;
}
};

题目11

剑指 Offer II 110. 所有路径

分析

797. 所有可能的路径一毛一样

代码

class Solution {
public:
int n;
vector<vector<int>> res;//结果
vector<int>road;//路径
void dfs(int u,vector<vector<int>>& graph){
road.push_back(u);
if(u==n-1)res.push_back(road);
for(auto x:graph[u])dfs(x,graph);
//回溯
road.pop_back();
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
n=graph.size();
dfs(0,graph);
return res;
}
};

总结

今天的题目偏简单qwq
image

本文作者:灰之魔女伊蕾娜

本文链接:https://www.cnblogs.com/daohengdao/p/16102981.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   灰之魔女伊蕾娜  阅读(31)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开