树的定义
树是n(n>=0)个节点的有限集。n=0时称为空树。在任意一棵非空树:
(1)有且仅有一个特定的称为根Root的结点
(2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…Tm,其中每一个集合本身又是一棵树,并称为根的子树。
节点分类
节点拥有的子树个数称为结点的 度(degree)
度为0的结点称为叶节点或终端结点
度不为0的结点称为非终端节点(或分支结点)
除根结点外,分支结点也称内部结点
树的度是树内各结点的度的最大值
度与深度
结点的层次,从根开始定义,根为第一层,根的孩子为第二层
树节点的最大层次称为树的深度(depth)或高度
有序树跟无序树
将树中节点的各子树看成从左到右是依次有次序的,不能互换的,则称树为有序树,否则无序树
树的存储结构
表示法:双亲表示法,孩子表示法,孩子兄弟表示法
就是在数据域后加入不同的指针域,指向不同的关系
二叉树
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称空二叉树),
或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成,
二叉树特点
- 每个结点最多有两棵子树,所以不存在度大于2的结点。没有子树有一棵子树都是可以的
- 左子树和右子树是有顺序的
- 即使有一个子树,也要分清左子树还是右子树
二叉树具有的5中形态
- 空二叉树
- 只有一个根节点
- 根节点只有左子树
- 根节点只有右子树
- 根节点既有左子树,又有右子树
特殊二叉树
- 斜树:所有结点都只有左结点,叫左子树
所有结点只有右结点,叫右子树
两者统称斜树 - 满二叉树:在一棵二叉树中,所有分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样的二叉树叫满二叉树,达到一个平衡的节奏
- 完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为 i 的结点与同样深度满二叉树中编号为i 的结点在二叉树的位置完全相同,则这棵二叉树称为完全二叉树
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
按层编号:编号从上往下,从左往右,不间断,
如果编号出现空档,说明不是完全二叉树
二叉树存储结构
二叉树的顺序存储结构:
用一维数组存储二叉树中节点,节点的存储位置,也就是数组下标要能体现节点之间的逻辑关系
1—–2—-3—-4—–5—-6—-7—-8—-9
A—-B—-C—-D—-E—-F—-G—H—-I
顺序存储结构一般只适用于完全二叉树
对于一棵深度为k的右斜树,要分配2的k次方-1个内存
二叉链表:
由数据域跟两个指针域构成
若再增加一个指向双亲的指针域,则称为三叉链表。