zoukankan      html  css  js  c++  java
  • 【数据结构oj】树的度

    image
    输入:ABC##DE#F#G####
    输出:3

    image

    不难看出,

    以二叉树方式存储的树,二叉树结点a的左孩子就是树结点a的左孩子,而二叉树a的右孩子是树节点的a的兄弟,既a父节点f_a的某个孩子(非长子)

    那么,可以通过遍历树的每个结点,编写算法,计算出每个结点的度(既树的孩子数目),找出其中最大的度,作为该树的度输出。

    第一版代码

    #include <stdio.h>
    #include <stdlib.h>
    
    int Max_degree = 0;
    typedef struct node{
    
        char data;
        int degree;
        struct node *lchild,*rchild;
    
    }BinTree;
    /*---创建二叉树---*/
    BinTree *CreateBinTree()
    {/*先序建立一个二叉树链表*/
        BinTree *bt = NULL;
        char ch;
    
        ch = getchar();
    
        if(ch!='#')
        {
            bt = (BinTree *)malloc(sizeof(BinTree));
            bt->data = ch;
            bt->lchild = CreateBinTree();
            bt->rchild = CreateBinTree();
    
        }
        return bt;
    
    }
    int getpiontDegree(BinTree *bin)
    {
        /*遍历找到一个不为空的节点,先判断它是否有左孩子(树的结点是否有孩子),然后计算左孩子的右孩子数目(树结点长子的兄弟数)*/
        if(bin!=NULL)
        {
            if(bin->lchild != NULL)
            {
                BinTree *p = bin->lchild;
                int n = 1;
                while(p->rchild !=NULL)
                {
                    p= p->rchild;
                    n++;
                }
                bin->degree = n;
            }
            getpiontDegree(bin->lchild);
            getpiontDegree(bin->rchild);
        }
    }
    void  firstprintfBinTreeDegree(BinTree *bt)
    {
        int a;
        /*遍历找到一个非空结点,将该结点与已经存储的Max_degree比较大小,找出最大度的结点*/
        if(bt != NULL)
        {
            if(bt->lchild)
            {
                if(Max_degree<bt->degree)
                {
                    Max_degree = bt->degree;
                }
    
    
            }
    
            firstprintfBinTreeDegree(bt->lchild);
            firstprintfBinTreeDegree(bt->rchild);
        }
    
    }
    
    
    
    int main()
    {
        BinTree *bin;
        bin = CreateBinTree();
        getpiontDegree(bin);
        firstprintfBinTreeDegree(bin);
        printf("%d",Max_degree);
    
    }
    
    
    

    第二版代码

    在getpiontDegree()函数中遍历每个结点,计算出每个结点的度,然后又在firstprintfBinTreeDegree()函数中遍历每个结点,找出其中度最大的结点,其中每个结点被重复遍历了两次,浪费了时间。我们完全可以利用firstprintfBinTreeDegree()中的遍历进行同时进行这两个操作,getpiontDegree()函数在firstprintfBinTreeDegree()函数中被调用,用来计算该循环下的每一个结点的度

    给出代码

    #include <stdio.h>
    #include <stdlib.h>
    typedef char dataType;
    int Max_degree = 0;
    typedef struct node{
    
        dataType data;
        int degree;
        struct node *lchild,*rchild;
    
    }BinTree;
    /*---创建二叉树---*/
    BinTree *CreateBinTree()
    {/*先序建立一个二叉树链表*/
        BinTree *bt = NULL;
        char ch;
    
        ch = getchar();
    
        if(ch!='#')
        {
            bt = (BinTree *)malloc(sizeof(BinTree));
            bt->data = ch;
            bt->lchild = CreateBinTree();
            bt->rchild = CreateBinTree();
    
        }
        return bt;
    
    }
    int getpointDegree(BinTree *bin)
    {
        if(bin->lchild!=NULL)
        {
            int degree = 1;
            BinTree *p = bin->lchild;
    
           while(p->rchild!=NULL)
           {
               degree++;
               p = p->rchild;
    
           }
           return degree;
    
        }
        return 0;
    
    }
    void  firstprintfBinTreeDegree(BinTree *bt)
    {
        if(bt != NULL)
        {/*---先序二叉树遍历---*/
    
    
            bt->degree = getpointDegree(bt);
            //printf("%c:%d ",bt->data,bt->degree);
            if(bt->degree > Max_degree)
            {
                Max_degree = bt->degree;
            }
            firstprintfBinTreeDegree(bt->lchild);
            firstprintfBinTreeDegree(bt->rchild);
        }
    
    }
    
    
    
    
    int main()
    {
        BinTree *bin;
        bin = CreateBinTree();
        firstprintfBinTreeDegree(bin);
        printf("%d",Max_degree);
        return 0;
    }
    
    

    image
    image

    ps:第一次做这个题,思路快就有了,但是代码总是打不出来。第一次尝试用的迭代,想不出来怎么把每次的度和迭代的跳出结合起来,代码乱套了。最后做出了来,oj还是不给ac,没弄明白,回来又把代码写了一遍,这次居然过了,真神奇

  • 相关阅读:
    uva 10129
    年化利率
    house买房原理,2019,第一版
    car二手车购买原理
    car购车翻译篇
    car配置篇
    健身原理
    语法学习,从句
    语法学习,简单语句
    名词解释
  • 原文地址:https://www.cnblogs.com/zhujiaozhu/p/15557379.html
Copyright © 2011-2022 走看看