树的学习

原创 2015年11月21日 11:09:17

我用的是人民邮电出版社的数据结构。看到本书对树的介绍,感觉晕晕的,他怎么就不按套路出牌了呢?前面几章都是按套路来,这个刚开始就告诉我一万种表示方法,有神马用。 首先是双亲表示法,书中就是带过,个人感觉作用没多大,哪有人用线性表表示树的,连接起来不得麻烦死。这里不想写它的代码,没用。接下来介绍了孩子表示法,从书后面的实验中感觉孩子表示法中的指针表示法是主流的树的表示方法。这里先介绍孩子表示法的指针表示。书中给的代码是这样的:

#define m 3
typedef struct node
{
    int data;
    struct node *child[m];
}node ,*tree;

这里有不明白的,首先是那个node *child[],我记得链表之中有一个node *next这个是用来链接下接下来的链表的。这个感觉跟那个没什么太大的区别,链表的后面只能链接一个,而用node *child [m]之后,他后面就可以链接m个了(child[0]一个,child[1]一个....)。接下来是这个,*tree是什么鬼?看了书中后面的代码,了解到,*tree等价于typedef node *tree ,意思就是struct node可以用node来表示,以可以用* tree来表示。他们两个的区别,举个例子,都来定义stl 。一个是node *stl 另一个是 tree stl差别就是这个。

接下来写一个带有主函数的代码(我也不知道为什么树全都是二叉树,可能是学了图就会了其他的树了吧,学图的时候回来再看):

用的书上的例子:


代码是:

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    char data;
    struct node *child[100];
} node,*tree;

tree creat()//前序输入
{
    tree a=(tree)malloc(sizeof(node));
    scanf("%c",&a->data);
    if(a->data!='#')
        for(int i=0; i<3; i++)
            a->child[i]=creat();
    else
        a=NULL;

    return a;
}

void preorder(tree a)//前序输出
{
    if(a!=NULL)
    {
        printf("%c",a->data);
        for(int i=0; i<3; i++)
            preorder(a->child[i]);
    }
}

void levelorder(tree a)//层次输出
{
    tree list[100];
    int s=0,e=1;
    list[0]=a;
    if(list[0]!=NULL)
    {
        while(s<e)
        {
            printf("%c",list[s]->data);
            for(int i=0; i<3; i++)
            {
                if(list[s]->child[i]!=NULL)
                {
                    list[e]=list[s]->child[i];
                    e++;
                }
            }
            s++;
        }
    }
}

void postorder(tree a)//后序输出
{
    if(a!=NULL)
    {
        for(int i=0; i<3; i++)
            postorder(a->child[i]);
        printf("%c",a->data);
    }
}

int main()
{
    tree a;
    a=creat();
    preorder(a);
    printf("\n");
    postorder(a);
    printf("\n");
    levelorder(a);

    return 0;
}


输入的测试数据是前序的:ab###ce###fh###i####g###d###(注意i后面是4个#不是三个!!!!)



                
版权声明:本文为博主原创文章,未经博主允许不得转载。

学习树的概念和相关术语

下面将介绍有关树的概念以及常用的术语。 树:树是由n>=0个结点组成的有限集合,当n=0时称为空树;当n>0的时候,结点需要满足: 1.有且仅有一个称为“根”的节点,也就是说有且仅有一个节点没有前...
  • bbc955625132551
  • bbc955625132551
  • 2017年06月02日 21:16
  • 369

AVL树学习

1.什么是AVL树           AVL树是带有平衡条件的二叉查找树,是其每个结点的左子树和右子树的高度差最多差1的二叉查找树。如图1,左边的树是AVL树,但右边的不是。 图1 左边...
  • qll125596718
  • qll125596718
  • 2011年11月18日 22:19
  • 2428

关于学习二叉搜索树的心得体会

首先,二叉搜索树是建立在此树是一棵中序遍历的二叉树的前提下的,基本原理也就是先将关键值与根节点进行比较,如果比根节点的data值小,就在此树的左树中去寻找,如果比根节点的data值大,就在该树的右子树...
  • nancysis
  • nancysis
  • 2017年07月11日 17:30
  • 143

树学习总结

树 树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是 因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年05月18日 16:02
  • 430

详细讲解赫夫曼树

写这篇文章的时候我已经是可以独立写出建立一颗赫夫曼树的代码了,其实内心还是挺有感触的,当时觉得很高大的东西现在也不过如此!          赫夫曼树的定义是:给定n个权值作为n个叶子结点,构造一棵...
  • zr1076311296
  • zr1076311296
  • 2016年05月23日 20:57
  • 451

T树索引的学习与实现(一)

前言: 有段时间在研究T树算法,在网上只找到一篇,借鉴了一下,但是原博客中的代码出现了大量的错误,所以自己 按照原博客的思想与大部分代码重新推算演练了一下,因为站在巨人的肩膀上,所以整理的容易了一些,...
  • u013815649
  • u013815649
  • 2016年07月18日 14:04
  • 1392

基于残差的提升树

注:本文中所有公式和思路来自于李航博士的《统计学习方法》一书,我只是为了加深记忆和理解写的本文。 首先应该先介绍一下提升树,提升树模型采用了加法模型和前向分布算法,基于决策树的提升也就是提升树,也就...
  • u012771351
  • u012771351
  • 2016年11月01日 10:25
  • 293

树与二叉树总结

1.树 2.二叉树 3.二叉树的节点类及二叉树类 4.二叉树的遍历 5.线索二叉树 6.树和森林 7.树的应用...
  • chinaaaaaaaaaaa
  • chinaaaaaaaaaaa
  • 2015年02月14日 21:23
  • 738

S3C2440中断跳转分析

2440init.s中断跳转分析     最近准备自己写一个S3C2440的启动代码。参阅了一下2440init.s这一启动代码。发现有很多人对于这个启动代码中的异常,特别是像外部中断这样的异常,到...
  • cjnewstar111
  • cjnewstar111
  • 2012年03月22日 19:05
  • 337

把学习由复杂变简单(二叉树和树)

现在发现二叉树和树讲起来真的是没完没了,刚发表博客之后发现,那还不足以表述这颗大树。我们继续完善。 树与二叉树遍历确实很重要,但是还有一些你也许忘记的重要知识点,我们再来看一下还有什么好玩的:我不太...
  • yi_zz
  • yi_zz
  • 2012年03月29日 23:27
  • 23277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树的学习
举报原因:
原因补充:

(最多只允许输入30个字)