ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构 - 树 - 一般树和森林的基本介绍

2022-05-17 12:32:30  阅读:172  来源: 互联网

标签:结点 遍历 struct typedef 介绍 链表 二叉树 数据结构 森林


树的存储结构

双亲表示法

通过保存树中每个结点的双亲结点的位置,来表示树中结点之间的结构关系。

#define MAX_TREE_SIZE  100
typedef struct PTNode
{
    ElemType data;
    int parent;    // 双亲位置(双亲的下标)
} PTNode;
typedef struct
{
    PTNode nodes[MAX_TREE_SIZE];
    int r, n;      // r为根的位置,n为结点数
} Ptree;

孩子表示法

通过保存树中每个结点的孩子结点的位置,表示树中结点之间的结构关系。

方法一:多重链表

类似于二叉链表,我们可以用多叉链表。具体实现有两种方式:定长结点不定长结点

  • 定长结点:优点是结点结构一致,便于实现树的操作,缺点是浪费一些内存空间。

  • 不定长结点:优点是节省内存空间,缺点是不定长的结点会使一些操作实现变复杂。

方法二:孩子链表

将树中的每个结点的孩子排列起来,看成一个线性表,采用线性链表进行存储。

树的孩子链表的类型定义如下:

typedef struct CTNode  // 孩子结点
{
    int child;
    struct CTNode* next;
} *ChildPtr;
typedef struct
{
    ElemType data;
    ChildPtr firstchild; // 孩子链表头指针
} CTBox;
typedef struct
{
    CTBox nodes[MAX_TREE_SIZE];
    int n, r;   // 结点数和根的位置
} CTree;

孩子兄弟表示法

我们也可以仍用二叉链表作为树的存储结构。

树的孩子兄弟表示法的类型定义如下:

typedef struct CSNode
{
    ElemType data;
    struct CSNode
        * firstchild,  //指向第一个孩子
        * nextsibling; //指向下一个兄弟
} CSNode, * CSTree;

树与二叉树

树与二叉树的转换

二叉树和树都可以用二叉链表存储,我们可以以二叉链表为中介,实现树与二叉树之间的转换。其转换的方法图示如下:

森林与二叉树的转换

森林:树的集合。

将森林中的树的根结点看作兄弟,用树与二叉树的转换方法,进行森林与二叉树的转换。

树的遍历

遍历:按一定规律走遍树的各个顶点,且使每一顶点仅被访问一次,即找一个完整而有规律的走法,以得到树中所有结点的一个线性序列。

常用方法如下:

  • 先根(序)遍历:先访问树的根结点,然后依次先根遍历根的每棵子树。

  • 后根(序)遍历:先依次后根遍历每棵子树,然后访问根结点。

  • 层次遍历:先访问第一层上的结点,然后依次遍历第二层,一直到最后一层的结点。

广义表建树

标签:结点,遍历,struct,typedef,介绍,链表,二叉树,数据结构,森林
来源: https://www.cnblogs.com/Black-treex/p/16280340.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有