【数据结构oj】树的度(树和二叉树的相互转化)

简介: 【数据结构oj】树的度(树和二叉树的相互转化)

e2e49c5493f2bf1706c67e06d97b3815_b753d377208e6d06bdc781838fc9a8d7.png

输入:ABC##DE#F#G####

输出:3

dce427095fa5dbe1f94e070a4d301639_1b268b61416a41fbbf428c7e39cebee1.png


不难看出,

以二叉树方式存储的树,二叉树结点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.pngimage.png

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


相关文章
|
21天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
60 16
|
21天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
76 8
|
1月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
26 7
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
24 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
26 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
1月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
28 1
|
1月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
25 1
|
1月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
32 0
|
1月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆