一、B3642 二叉树的遍历 - 洛谷

算法代码:
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct Node
{
int v;
int ls,rs;
}t[N];
void preorder(int p)
{
if(p!=0)
{
cout<<t[p].v<<" ";
preorder(t[p].ls);
preorder(t[p].rs);
}
}
void midorder(int p)
{
if(p!=0)
{
midorder(t[p].ls);
cout<<t[p].v<<" ";
midorder(t[p].rs);
}
}
void postorder(int p)
{
if(p!=0)
{
postorder(t[p].ls);
postorder(t[p].rs);
cout<<t[p].v<<" ";
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
t[i].v=i;
t[i].ls=a;
t[i].rs=b;
}
preorder(1);
cout<<endl;
midorder(1);
cout<<endl;
postorder(1);
cout<<endl;
return 0;
}
二、1.子树的大小 - 蓝桥云课


算法代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,m,k;
cin>>n>>m>>k;
ll ans=1;
ll ls=k,rs=k;
while(1)
{
ls=(ls-1)*m+2;
rs=rs*m+1;
if(ls>n)
{
break;
}
if(rs>=n)
{
ans+=n-ls+1;
break;
}
ans+=rs-ls+1;
}
cout<<ans<<endl;
}
return 0;
}
三、1.FBI树 - 蓝桥云课


算法代码:
#include <bits/stdc++.h>
using namespace std;
char s[1100],tree[4400];
int ls(int p)
{
return p<<1;
}
int rs(int p)
{
return p<<1|1;
}
void build_FBI(int p,int left,int right)
{
if(left==right)
{
if(s[right]=='1')
{
tree[p]='I';
}
else
{
tree[p]='B';
}
return;
}
int mid=(left+right)/2;
build_FBI(ls(p),left,mid);
build_FBI(rs(p),mid+1,right);
if(tree[ls(p)]=='B'&&tree[rs(p)]=='B')
{
tree[p]='B';
}
else if(tree[ls(p)]=='I'&&tree[rs(p)]=='I')
{
tree[p]='I';
}
else
{
tree[p]='F';
}
}
void postorder(int p)
{
if(tree[ls(p)])
{
postorder(ls(p));
}
if(tree[rs(p)])
{
postorder(rs(p));
}
printf("%c",tree[p]);
}
int main()
{
int n;
cin>>n;
cin>>s+1;
build_FBI(1,1,strlen(s+1));
postorder(1);
}
四、1.完全二叉树的权值 - 蓝桥云课


算法代码:
#include <bits/stdc++.h>
using namespace std;
// 递归函数,计算从某一层开始的权值之和
pair<int, int> dfs(int depth, int start, int N, const vector<int>& A) {
if (start >= N) {
return {0, depth - 1}; // 如果超出范围,返回 0 和上一层的深度
}
// 计算当前层的结束索引
int end = min(start + (1 << (depth - 1)), N);
int sum = 0;
for (int i = start; i < end; ++i) {
sum += A[i];
}
// 递归计算下一层的权值之和
auto next = dfs(depth + 1, end, N, A);
// 比较当前层和下一层的权值之和
if (sum >= next.first) {
return {sum, depth}; // 如果当前层更大,返回当前层的深度
} else {
return next; // 否则返回下一层的结果
}
}
int main() {
int N;
cin >> N;
vector<int> A(N);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}
// 调用递归函数,从深度 1 开始
auto result = dfs(1, 0, N, A);
// 输出结果
cout << result.second << endl;
return 0;
}