补充一下二叉树基础
二叉树的储存
考虑一个二叉树的每个节点都有两个子节点,所以我们可以考虑用一个结构体来存储:
struct node {
int left, right;
};
node tree[MAX]
二叉树的遍历
编号为1的节点是二叉树的根节点。
于是我们可以从根节点出发,先递归遍历该节点的左节点,再递归遍历该节点的右节点。
如果要求深度,还得记录一下deep++
dfs(tree[id].left, deep+1);
dfs(tree[id].right, deep+1);
每到一个节点更新深度
ans = max(ans, deep);
到达叶子节点时,就return
if (id == 0) return;
题库
二叉树的一个模型,,,其实可以不用二叉树做
// made by Arc on 2021/2/7
//luogu P4715
#include <bits/stdc++.h>
using namespace std;
queue<pair<int,int> > q;//用pair有个好处就是不用结构体了
int main(){
int n;
cin>>n;
int N=1<<n;
for (int i = 1; i <= N ; ++i) {
int a;
cin>>a;
q.push(make_pair(i,a));
}
while(q.size()>2){
int x1=q.front().first;
int x2=q.front().second;
q.pop();
int y1=q.front().first;
int y2=q.front().second;
q.pop();
if(x2>y2){
q.push(make_pair(x1,x2));
}
else{
q.push(make_pair(y1,y2));
}
}
int x1=q.front().first;
int x2=q.front().second;
q.pop();
int y1=q.front().first;
int y2=q.front().second;
q.pop();
if(x2>y2)
cout<<y1<<endl;
else
cout<<x1<<endl;
}
二叉树的深度
p4913
// made by Arc on 2021/2/7
//luogu P4913
#include <bits/stdc++.h>
const int MAXN=1e6+10;
using namespace std;
struct Tree{
int left;
int right;
};
Tree tree[MAXN];
int ans=0;
void dfs(int i,int deep){
if(i==0)//应该不能只判断tree[i].left==0因为可能只有右边有值
return ;
if(deep>ans){
ans=deep;
}
dfs(tree[i].left,deep+1);
dfs(tree[i].right,deep+1);
}
int main(){
int n;
cin>>n;
for (int i = 1; i <= n ; ++i) {
cin>>tree[i].left;
cin>>tree[i].right;
}
dfs(1,1);
cout<<ans<<endl;
return 0;
}
写错一行导致debug了一个小时没谁了呜呜呜,码代码也不能走神呜呜
// made by Arc on 2021/2/7
//luogu P1364
//本题有用树状dp的,但是我不会嘤嘤嘤
//不过可以用floyed求一下最短路(只适用于数据不多的情况)
#include <bits/stdc++.h>
const int MAXN=1e3+10;
using namespace std;
int a[MAXN];
int f[MAXN][MAXN];
int main(){
int n;
cin>>n;
for (int i = 1; i <= n ; ++i) {
for (int j = 1; j <= n ; ++j) {
f[i][j]=1000000;//因为最大是1e5
}
}
//构造邻接矩阵
for (int i = 1; i <= n ; ++i) {
int l, r;
cin >> a[i] >> l >> r;
f[i][i] = 0;
if (r > 0) {//一开始这里忘记判断>0了
f[i][r] = 1;
f[r][i] = 1;
}
if (l > 0) {
f[l][i] = 1;
f[i][l] = 1;
}
}
// cout<<f[2][3]<<endl;
// cout<<f[2][1]<<endl;
// cout<<f[1][3]<<endl;
for (int i = 1; i <= n ; ++i) {
for (int j = 1; j <= n ; ++j) {
if(i!=j)
for (int k = 1; k <= n ; ++k) {
if(i!=k&&j!=k){
if(f[j][k]>f[j][i]+f[i][k]) {
f[j][k] = f[j][i] + f[i][k];
}
}
}
}
}
//cout<<f[1][4]<<endl;
int minn=0x7f7f7f7f;
for (int i = 1; i <= n ; ++i) {
int minx=0;int j;
for (j = 1; j <= n; ++j) {
minx+=f[i][j]*a[j];
}
minn=min(minn,minx);
}
cout<<minn<<endl;
}