[蓝蓝计算机考研算法]-day19完全数&求二叉树最大深度

171 阅读1分钟

完全数

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。有6、28、496、8128等等。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

输入n,请输出n以内(含n)完全数的个数。 数据范围: 1<=n<5*10的5次方

输入描述

输入一个数字n。

输出描述

输出不超过n的完全数的个数

示例

 输入:1000 
 输出:3

思路

  • 利用双层for循环,外层循环判断2到n,内层判断其是否为完全数,若是,则计数器+1。

  • 判断因子:循环遍历1到n-1,对其取余,看余数是否为0,为0则表示能除尽,即是因子数。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,sum=0,cnt=0;
	cin>>n;
	for(int i=2; i<=n; i++){ //外层循环2到n 
		for(int j=1; j<i; j++){ //内层为判断i是否为完美数 
			if(i%j==0) sum+=j; //因子数相加 
		} 
		if(sum==i) cnt++; //判断因子数是否等于本身,若相等则计数器+1 
		sum=0; //判断结束,sum置零重新循环加和 
	} 
	cout<<cnt;
	return 0;
}

求二叉树最大深度

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为1。

数据范围:节点的数量满足 0≤n≤100,节点上的值满足0≤val≤100。 进阶:空间复杂度 O(1) ,时间复杂度O(n)。

假如输入的用例为{1,2,4,#,#,5,7,#,#,#,3,#,6,#,#},那么如下图:

image.png

示例

输入:1 2 4 # # # 3 # # 
输出:3

思路

  1. 定义二叉树数据结构。

  2. 写一个递归函数:先序遍历建立二叉树。

  3. 写一个递归函数:求二叉树深度。

  4. 在主函数中调用函数,建立二叉树和求深度。最后输出。

具体实现

#include<bits/stdc++.h>
using namespace std;

typedef struct node{
	string data;
	struct node *lchild, *rchild;
	node(string x):data(x), lchild(nullptr), rchild(nullptr){}
}*BitTree;

//先序遍历创建二叉树
void CreatT(BitTree &T){
	string c;
	cin>>c;
	if(c == "#") T=nullptr;
	else{
		T = new node(c);
		CreatT(T->lchild);
		CreatT(T->rchild);
	}
} 

//求二叉树深度 
int Deepth(BitTree T){
	if(T == nullptr) return 0;
	int x = Deepth(T->lchild);
	int y = Deepth(T->rchild );
	return max(x,y)+1;
}

int main(){
	BitTree T;
	CreatT(T);
	cout<<Deepth(T);
	
	return 0;
}

小结

  • 二叉树的递归的代码必须要熟练掌握。

  • 注意测试用例,用先序遍历,所以测试用例必须是先序的次序才可以,用其他序是输出不了结果的!!!