树的存储结构

    树的定义:树是n(n>=0)个结点的有限集,n为零时为空树。在非空树中,有且仅有一个根结点,当n>1时,其余结点可以分为m(m>0)个互不相交的有限集每一个集合又是一棵树,称为根的子树。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 结点的度:结点拥有的子树个数

(比如结点A的度为2)

 

叶结点(终端结点):度为0的结点   

(比如结点G、H、I)

 

分支结点(非终端结点):度不为0的结点

 

内部结点:除了根结点之外的分支结点

 

树的度:树内某个拥有最大度的结点的度

(比如上图中树的度为3)

 

 

    结点间的关系:

 

结点的孩子:结点的子树的根

(比如A的孩子为B和C)

 

结点的双亲:有孩子的结点称为该孩子的双亲

(比如B和C的双亲为A)

 

结点的兄弟:同一个双亲的孩子之间互称兄弟

(比如B和C互为兄弟)

 

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

(比如H的祖先有D、B、A)

 

结点的子孙:以某结点为根的子树中任一结点都为该根结点的子孙。

(比如B的子孙有D、G、H、I)

 

结点的层次:从根开始定义起,根为第一层,根的孩子为第二层···

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

树的深度(高度):树中结点的最大层次

(该树的深度为4)

 

有序树与无序数:将树中结点看成从左至右是有次序的不能互换的,则为有序树,否则为无序数。

 

森林:m(m>=0)棵互不相交的树的集合

(比如上图的两个子树可以看作森林)

 

 

    树的存储结构:

 

1.双亲表示法:

可以用数组来存储树,用数据域data来存储数据 ,用指针域parent来存储该结点的双亲在数组中的下标。因为根结点没有双亲,所以其指针域存储-1。上图可以用双亲表示法表示为:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 双亲表示法可以通过parent指针快速找到某个结点的双亲,但是要找某个结点的孩子只能遍历整个数组。所以可以在双亲表示法上加一个该结点最左边的孩子指针域,叫做长子域。没有孩子的结点,其长子域存入-1。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 如果很关注兄弟间的关系,可以加一个又兄弟域。如果该结点存在右兄弟,则把其右兄弟的下标存入rightsib,若没有右兄弟,则存入-1。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

2.孩子表示法:

每个结点都创建一个单链表,把该结点的孩子存入链表中,且该结点为链表的头结点。然后把头结点存入一个一维数组中。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 此时通过孩子表示法很容易找到某结点的孩子与兄弟,但是想要查找某结点的双亲就需遍历整棵树。可以把双亲表示法和孩子表示法结合起来,称为双亲孩子表示法,只需在每个头结点加一个指针域parent。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

3.孩子兄弟表示法:

因为任何一个结点的第一个孩子如果存在就是唯一的,和其右兄弟如果存在也是唯一的。所以可以创建一个结构来存储树:一个数据域data,一个指向其第一个孩子的指针域firstchild,一个指向其右兄弟的指针域rightsib。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值