八月十九日数据结构逻辑结构树

1.4树
数据结构逻辑结构的一种

在这里插入图片描述

与线性表表示的一一对应的线性关系不同,树表示的是数据元素之间更为复杂的非线性关系。

直观来看,树是以分支关系定义的层次结构。树在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可以用树的形象来表示。
在这里插入图片描述

简单来说,树表示的是1对多的关系。

定义(逻辑结构):

树(Tree)是n( n>=0 )个结点的有限集合,没有结点的树称为空树,在任意一颗非空树中:
有且仅有一个特定的称为根(root)的结点
当n>1的时,其余结点可分为 m( m>0 ) 个互不相交的有限集T1,T2,…, Tm,其中每一个集合 Ti 本身又是一棵树,并且称之为根的子树。

注意:树的定义是一个递归定义,即在树的定义中又用到树的概念。
在这里插入图片描述

比如,这颗树,其中A是根,其余结点分成3个互不相交的子集:
T1={B, E, F, K, L}
T2={C, G}
T3={D, H, I, J}
T1, T2, T3 都是 A 的子树,且其本身也是一棵树。

比如T1, 其根为B, 其余结点分为两个互补相交的子集:
T11={E, K, L}
T12={F}
T11和T12都是T1的子树,且其本身也是一棵树。

1.4.1基本概念
在这里插入图片描述

一个结点的子树的根,称为该结点的孩子(儿子),相应的该结点称为子树的根的父亲。
A b c d
A 是BCD 父亲
BCD 是A的孩子
没有孩子的结点称为树叶,又叫叶子结点。
K L F G H I J
具有相同父亲的结点互为兄弟。
{b, c, d} {e, f}, {H , I, J}.
用类似的方法可以定义祖父和孙子的关系。

从父结点n1 到 nk 的路径定义为节点 n1 n2 … nk 的一个序列,使得对于 1 <= i < k,节点 ni是 ni+1 的父亲。这条路径的长是为该路径上边的条数,即 k-1。

从每一个结点到它自己有一条长为 0 的路径。
注意,在一棵树中从根到每个结点恰好存在一条路径。

如果存在从n1到n2的一条路径,那么n1是n2的一位祖先 ,而n2是n1的一个后裔。如果n1 != n2,那么n1是n2的真祖先, 而n2是n1的真后裔。

结点的层级从根开始定义,根为第一层,根的孩子为第二层。若某结点在第i层,则其孩子就在i+1层。
在这里插入图片描述

对任意结点ni,ni的深度为从根到ni的唯一路径的长。因此,根的深度为0。
在这里插入图片描述

ni 的高是从ni 到一片树叶的最长路径的长。因此,所有树叶的高都为0。
在这里插入图片描述

一颗树的高等于它根的高。一颗树的深度等于它最深的树叶的深度; 该深度总是等于这棵树的高。

如果一棵树有n个结点,那么它有n-1条边。
度: 含有子树的个数
出度: 含有子树的个数(发出几条边)
入度: (收到几条边, 被指向)
根节点
树中 n节点 x边
N <= x
X <= n

1.4.1.1转化树的结构

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.4.2二叉树
树中的一个特例
二叉树是一棵树,它的特点是每个结点至多有两棵子树。并且,子树有左右之分,其次序不能颠倒(有序)。

在这里插入图片描述

1.4.2.1特殊的二叉树
特殊的二叉树:完全二叉树、满二叉树和完美二叉树
在这里插入图片描述

完全二叉树: 如果一个节点, 在同一层级, 右侧没有节点, 那么这个节点就是这个树的最后一个节点(层级)
满二叉树: 度只有0 和 2
一个节点, 要么是叶子(没有任何子树), 要么左右子树都存在
完美二叉树: 每一个层级都是满的

Q1: 完美二叉树既是完全二叉树又是满二叉树? 对的
Q2: 如果一棵树既是完全二叉树又是满二叉树,那么它是完美二叉树? 不对
1.4.2.2二叉树的特点
二叉树具有以下重要性质:
二叉树在第i层至多有2的i-1次方个节点
1-1 2的0
2-2 2 的 1
K 2 的k-1
K+1 2 的 k

层次为k的二叉树至多有2的k次方-1个节点
1层 2的一次方 -1
2层 2的2次方 -1
K层 2的k次方 -1
K+1层(单这一层) 2k次方
整体 2的 k+1 次方 -1

对任何一颗二叉树T,如果其叶子节点数为n0 , 度为2的节点数为n2,则n0 = n2 + 1
边= n0+n1+n2-1
边=2n2 + n1

具有n个节点的完全二叉树,树的高度为log2n (向下取整)。
K层树: 2的k次方 -1
k-1层树: 2的k-1次方 -1
2的k-1次方 <=n<2的k次方

如果对一颗有n个结点的完全二叉树的结点按层序从1开始编号,则对任意一结点有:
如果编号i为1,则该结点是二叉树的根;
如果编号i > 1,则其双亲结点编号为 parent(i) = i/2,
若 2i > n 则该结点没有左孩子,否则其左孩子的编号为 2i,
若 2i + 1 > n 则该结点没有右孩子,否则其右孩子的编号为 2i + 1。

在这里插入图片描述

1.4.2.3二叉树的存储结构
在这里插入图片描述

1.4.2.4遍历

我们再来回顾一下二叉树的递归定义,可知,二叉树由3部分组成:根,左子树和右子树,因此如果能遍历这三个部分,便是遍历了整个二叉树。

假如以L, D, R分别表示左子树,根结点和右子树,则可能有DLR, LDR, LRD, DRL, RDL, RLD这六种遍历方案。

若限定先左后右,则只有DLR, LDR, LRD 这3种情况,分别称之为先 (根) 序遍历,中(根)序遍历,和后 (根) 序遍历。三者的区别主要在于访问根结点的先后顺序。

限定先左后右: 左右根, 左根右, 根左右
先序遍历: 先遍历根, 再遍历 左 再遍历 右
中序: 遍历左, 遍历根, 遍历 右
后续: 先左, 再右 再根

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值