当前位置: 首页 > news >正文

二叉树 —— 数据结构基础刷题路程

一、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;
}

http://www.mrgr.cn/news/96828.html

相关文章:

  • Linux内核中ARP协议的实现与dev_addr字段的作用
  • 基于Python的医院信息管理系统的设计与实现
  • Windows家庭版如何开启Hyper-V与关闭Hyper-V
  • 山东大学《多核平台下的并行计算》实验笔记
  • 相机的曝光和增益
  • Linux中的权限管理(附加详细实验示例)
  • JavaFX基础- Button 的基本使用
  • 基于 docker 的 LLaMA-Factory 全流程部署指南
  • Kubernetes 入门篇之Master节点部署与安装
  • 基于SpringBoot的“考研学习分享平台”的设计与实现(源码+数据库+文档+PPT)
  • 【C++进阶四】vector模拟实现
  • Python设计模式:责任链模式
  • Foldseek快速蛋白质结构比对
  • 【C++初阶】---类和对象(下)
  • 【Linux】系统文件的权限管理
  • Ubuntu修改用户名
  • Spring 面经
  • k8s运维面试总结(持续更新)
  • Python入门(5):异常处理
  • 基础算法篇(3)(蓝桥杯常考点)—图论