数据结构:树(基本概念)

集合中的元素关系呈现出一对多的情况(非线性结构,1:n)
1 树的定义
树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :
有且仅有一个特定的称为根(Root)的节点
其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树(Subtree)。
树的定义具有 递归性 ,即“ 树中还有树 ”。

 

2 树的概念
结点: 使⽤树结构存储的每一个数据元素都被称为“结点”。例如图中的A就是一个结点。
根结点: 有一个特殊的结点,这个结点没有前驱,我们将这种结点称之为根结点。
父结点(双亲结点)、子结点和兄弟结点: 对于ABCD四个结点来说,A就是BCD的⽗结点,也称之为双亲结点。 ⽽BCD都是A的子结点,也称之为孩子结点。对于BCD来说,因为他们都有同一个爹,所以它们互相称之为兄弟结点。
度(degree):
                  结点的度:这个结点的分叉数量
                  度为0的结点:叶子结点
                  树的度:这颗树中,所有结点的度的最大值
深度/高度(height):
                  结点的深度/高度:根结点在第一层,根的孩子在第二层,依次类推。
                  树的深度/高度:这棵树中,结点的高度的最大值
小练习
结点A的度:3    结点B的度:2    结点M的度:0
结点A的孩子:B C D     结点B的孩子:E F
树的度:3       树的深度:4
叶子结点:K L F G M I J
结点A是结点F的祖先
结点F是结点K的叔叔结点
3 树的存储结构
树是怎么存储的?
元素:A B C D E F....
元素关系:<A,B> <A,C> <A,D>
如何存储关系?
我们有三种表示方法
3.1 双亲表示法
双亲表示法采⽤顺序表(也就是数组)存储普通树,其实现的核心思想是:顺序存储各个节点的同时,给各节点附加一个记录其⽗节点位置的变量。
利⽤顺序表存储,表元素由数据和⽗结点构成
根节点没有⽗节点(⽗节点又称为双亲节点),因此根节点记录⽗节点位置的变量通常置为 -1。

 特点:

根结点没有双亲,所以位置域设置为-1
知道一个结点,找他的⽗结点,非常容易,O(1)级
找孩子结点,必须遍历整个表(找孩子难,找兄弟结点也难)
3.2 孩子表示法
孩子表示法存储普通树采⽤的是 "顺序表+链表" 的组合结构。
其存储过程是:从树的根结点开始,使⽤顺序表依次存储树中各个结点。需要注意,与双亲表示法不同的是,孩子表示法会给各个结点配备一个链表,⽤于存储各结点的孩子结点位于顺序表中的位置。
如果结点没有孩子结点(叶子结点),则该结点的链表为空链表。
使⽤孩子表示法存储的树结构,正好和双亲表示法相反,查找孩子结点的效率很⾼,⽽不擅长做查找⽗结点的操作。
我们还可以将双亲表示法和孩子表示法合二为一:
3.3 孩子兄弟表示法
在树结构中,同一层的节点互为兄弟节点。例如普通树中,节点 A、B 和 C 互为兄弟节点,⽽节点 D、E 和 F 也互为兄弟节点。
所谓孩子兄弟表示法,指的是⽤将整棵树⽤二叉链表存储起来,具体实现方案是:从树的根节点开始,依次存储各个结点的孩子结点和兄弟结点。
在二叉链表中,各个结点包含三部分内容:
在以孩子兄弟表示法构建的二叉链表中,如果要查找结点 x 的所有孩子,则只要根据该结点的 firstchild 指针找到它的第一个孩子,然后沿着孩子结点的 nextsibling 指针不断地找它的兄弟结点,就可以找到结点 x 的所有孩子。
特点:找孩子和兄弟好找,父结点不好找。
 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值