luogu二叉树刷题

补充一下二叉树基础


二叉树的储存

考虑一个二叉树的每个节点都有两个子节点,所以我们可以考虑用一个结构体来存储:

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;

题库


p4715

二叉树的一个模型,,,其实可以不用二叉树做

// 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;
}

p1364

写错一行导致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;


}
为了自己,和那些爱你的人
原文地址:https://www.cnblogs.com/zhmlzhml/p/14384456.html