• 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;
    
    
    }
    
    为了自己,和那些爱你的人
  • 相关阅读:
    Mysql如何修改unique key
    centos 编译 安装 protobuf
    EasyNetQ简单使用
    微信发送模板消息
    Python删除开头空格
    代码积累-Common
    sql With(NoLock),With(ReadPast)
    webform 使用log4net配置
    log4net.dll添加报错
    js-小数计算问题
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/14384456.html
Copyright © 2020-2023  润新知