数据结构—树形结构

本文详细介绍了树的概念,包括根节点、叶节点、分支节点的定义,以及节点的度、层次、深度等属性。同时,文章讨论了有序树与无序树的区别,并阐述了森林与树的关系。此外,还探讨了树在计算机中的存储形式,如双亲表示法、孩子表示法、双亲孩子表示法和孩子兄弟表示法,及其各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树的概念

 由N(N>=0)个节点组成的集合。对N > 1的树,有:

  1. 有一个特殊的结点,称为根结点,根节点没有前驱结点
  2. 除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、 ……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似 的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继

因此,树是递归定义的。

结点:结点包括一个数据元素及若干指向其他子树的分支(指针)

结点的度:结点拥有子树的个数称为该结点的度

叶结点:度为0的结点称为叶结点,叶结点也称为终端结点

分支结点:度不为0的结点称为分支结点,分支结点也称为非终端节点。一 棵树中除叶节点外的所有节点都是分支结点

祖先结点:从根节点到该结点所经分支上的所有节点

子孙结点:以某节点为根节点的子树中所有节点

双亲结点:树中某节点有孩子结点,则这个结点称为它孩子结点的双亲结 点,双亲结点也称为前驱结点

孩子结点:树中一个节点的子树的根节点称为该结点的孩子结点,孩子结 点也称为后继结点

兄弟结点:具有相同双亲结点的结点称为兄弟结点

树的度:树中所有节点的度的最大值称为该树的度

结点的层次:从根节点到树中某节点所经路径上的分支数称为该结点的层 次,根节点的层次为1,其他结点层次是其双亲结点层次加1

树的深度:树中所有节点的层次的最大值称为该树的深度

有序树:树中结点的各棵子树T0、T1…是有序的,即为有序树。其中T1 叫做根的第一棵子树,T2叫着根的第二棵子树

无序树:树中结点的各棵子树之间的次序不重要,可以相互交换位置

森林:m棵树的集合(m大于等于0)。在自然界中树和森林是两个不同的 概念,但在数据结构中,它们之间的差别很小。删去一棵非空树的根节 点,树就变成森林;反之若增加一个节点,让森林中每一棵树的根节点都 变成他的子女,森林就变成一棵树

树的表示方法 

 

树的存储形式

计算机中存储树的信息,要求既要存储结点的数据元素信息,又要存储结 点之间的逻辑关系信息

双亲表示法:用指针表示出每个结点的双亲结点

typedef int DataType;
struct Node
{
           DataType _data;  //结点中的数据
           struct Node* _pParent;  //指向双亲结点的指针
};

优点:寻找一个节点的双亲结点操作实现很方便  

缺点:寻找一个节点的孩子结点很不方便

孩子表示法:用指针指出每个结点的孩子结点 

typedef int DataType;
struct Node
{
          DataType _data;  //结点中的数据
          struct Node* _pChild1;  //第一个孩子的指针
          struct Node* _pChild2;  //第二个孩子的指针
          struct Node* _pChild3;  //第三个孩子的指针
};

 

优点:寻找一个节点的孩子结点比较方便  

缺点:寻找一个节点的双亲结点很不方便 

双亲孩子表示法:用指针既表示出每个结点的双亲结点,也表示出每个结点 的孩子结点,即:双亲表示法+孩子表示法

typedef int DataType;
struct Node
{
          DataType _data;  //结点中的数据
          struct Node* _pParent;  //双亲结点的指针
          struct Node* _pChild1;  //第一个孩子的指针
          struct Node* _pChild2;  //第二个孩子的指针
          struct Node* _pChild3;  //第三个孩子的指针
};

优点:找某个结点的双亲结点和孩子结点非常方便

孩子兄弟表示法:即表示出每个结点的第一个孩子结点,也表示出每 个结点的下一个兄弟结点

typedef int DataType;
struct Node
{
          DataType _data;  //结点中的数据
          struct Node* _pChild1;  //第一个孩子的指针
          struct Node* _pNextBrother;  //该结点的下一个兄弟结点的指针
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值