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<cstdio>
    #include <queue>
    using namespace std; 
    struct node{
        int l,r,f,deep;
    }t[100002];
    int head[100002],to[200002],next[3000002],len[100002];
    bool f[100002];
    int n,max1,maxn;
    queue<int> q;
    int max(int a,int b){return a>b?a:b;}
    void cz(int x){
        t[x].deep=t[t[x].f].deep+1;
        if(t[x].l) cz(t[x].l);
        if(t[x].r) cz(t[x].r);
    }
    int work(int x){
        f[x]=1;
        q.push(x);
        int p;
        len[x]=0;         //bfs求最长链
        while(!q.empty()){
            p=head[x];
            while(p){
                if(!f[to[p]]){
                    q.push(to[p]);
                    len[to[p]]=len[x]+1;
                    max1=max(max1,len[to[p]]);
                    f[to[p]]=1;        
                }
                p=next[p];
            }
            q.pop();
            x=q.front();
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&t[i].l,&t[i].r);
            if(t[i].l!=0){
                t[t[i].l].f=i;
                to[0]++;
                to[to[0]]=t[i].l;
                next[to[0]]=head[i];
                head[i]=to[0];
                to[0]++;
                to[to[0]]=i;
                next[to[0]]=head[t[i].l];
                head[t[i].l]=to[0];
            }
            if(t[i].r!=0){
                t[t[i].r].f=i;
                to[0]++;
                to[to[0]]=t[i].r;
                next[to[0]]=head[i];
                head[i]=to[0];
                to[0]++;
                to[to[0]]=i;
                next[to[0]]=head[t[i].r];
                head[t[i].r]=to[0];
            }                    //建立边表
        }
        cz(1);max1=0;
        for(int i=1;i<=n;i++) if(max1<t[i].deep){max1=t[i].deep;maxn=i;}//找最深节点;
        max1=0;
        work(maxn);
        printf("%d",max1);
        return 0;
    }
    View Code
  • 相关阅读:
    论架构在嵌软设计中的重要性
    妙用typeof关键字
    说说动态内存分配
    3个实用shell脚本,建议收藏!
    GNU C语法扩展(7)
    Ubunt_配置_nfs(文件挂载)
    Ubunt_配置_samba(文件共享)
    Ubunt_配置_tftp(文件传输)
    Ubunt_配置_net
    驱动_Platform平台总线
  • 原文地址:https://www.cnblogs.com/qingang/p/5742821.html
Copyright © 2011-2022 走看看