zoukankan      html  css  js  c++  java
  • 最长链(递归)

    最长链

    题目描述:
    现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根。
    输入描述:
    输入的第1行为包含了一个正整数N,为这棵二叉树的结点数,结点标号由1至N。
    接下来N行,这N行中的第i行包含两个正整数l[i], r[i],表示了结点i的左儿子与右儿子编号。如果l[i]为0,表示结点i没有左儿子,同样地,如果r[i]为0则表示没有右儿子。
    输出描述:
    输出包括1个正整数,为这棵二叉树的最长链长度。
    样例输入:
    5
    2 3
    4 5
    0 6
    0 0
    0 0
    样例输出:
    4
    数据范围及提示:
    【样例说明】
      4-2-1-3-6为这棵二叉树中的一条最长链。
    【数据规模】
    对于10%的数据,有N≤10;
    对于40%的数据,有N≤100;
    对于50%的数据,有N≤1000;
    对于60%的数据,有N≤10000;
    对于100%的数据,有N≤100000,且保证了树的深度不超过32768。
    【提示】
    关于二叉树:
    二叉树的递归定义:二叉树要么为空,要么由根结点,左子树,右子树组成。左子树和右子树分别是一棵二叉树。
    请注意,有根树和二叉树的三个主要差别:
    1. 树的结点个数至少为1,而二叉树的结点个数可以为0;
    2. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;
    3. 树的结点无左、右之分,而二叉树的结点有左、右之分。
    关于最长链:
    最长链为这棵二叉树中一条最长的简单路径,即不经过重复结点的一条路径。可以容易证明,二叉树中最长链的起始、结束结点均为叶子结点。

    广度优先搜索:

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #define MAXN 100001
    #define MAXM 1000001*2
    using namespace std;
    int n,tot,head[MAXN],dis[MAXN],maxtot,maxt;
    struct data
    {
        int v,next;
    }e[MAXM];
    void add(int u,int v)
    {
        e[++tot].v=v;
        e[tot].next=head[u];
        head[u]=tot;
    }
    int bfs(int u)
    {
        queue<int> q;
        q.push(u);
        memset(dis,-1,sizeof(dis));
        dis[u]=0;
        maxtot=0;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=head[u];i;i=e[i].next)
            {
                int v=e[i].v;
                if(dis[v]==-1)
                {
                    dis[v]=dis[u]+1;
                    q.push(v);
                    if(dis[v]>maxtot)
                    {
                        maxtot=dis[v];
                        maxt=v;
                    }
                }
            }
        }
        return maxt;
    }
    int main()
    {
        int x;
        cin>>n;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=2;j++)
          {
              cin>>x;
              if(x)
              add(i,x);
              add(x,i);
          }
        int t=bfs(1);
        bfs(t);
        printf("%d",maxtot);
        return 0;
    }

    深度优先搜索:

    #include<iostream>
    using namespace std;
    const int maxn=100010;
    int n,ans,l[maxn],r[maxn],d[maxn];
    void dfs(int x)
    {
        if(!l[x]&&!r[x])
        {
            d[x]=1;
            return;
        }
        if(l[x]) dfs(l[x]);
        if(r[x]) dfs(r[x]);
        ans=max(ans,d[l[x]]+d[r[x]]);
        d[x]=max(d[l[x]],d[r[x]])+1;
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>l[i]>>r[i];
        dfs(1);
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    微信开发:消息回复总结
    *** wechat-php-sdk 微信公众平台php开发包
    **微信接入探秘(一)——从零认识微信接口(主动接口和被动接口)
    《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】
    Linux进程调度原理【转】
    Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)【转】
    Tslib触摸屏官网【转】
    Tslib的移植【转】
    Linux Kernel代码艺术——数组初始化【转】
    Linux 内核进程管理之进程ID【转】
  • 原文地址:https://www.cnblogs.com/cax1165/p/6071001.html
Copyright © 2011-2022 走看看