树和二叉树
树和二叉树
- 树的定义
树(Tree)是由n(n≥0)个结点构成的有限集合。结点数为0的树称为空树,结点数大于0的树称为非空树
相关概念解释:
结点:由数据元素和构造数据元素之间关系的指针组成

叶子结点和分支结点:将度为0的结点称为叶子结点,又称为终端结点。将度不为0的结点称为分支结点,又称为非终端结点(有一个孩子节点就是度为1,有两个孩子结点就是度为2,没有孩子结点就是度为0)。
孩子结点和双亲结点:某结点子树的根结点称为该结点的孩子结点。该结点称为孩子结点的双亲结点。
兄弟结点:具有同一双亲的结点互为兄弟结点
后裔和祖先:一个结点的所有子树上的任何结点都是该结点的后裔。该结点称为这些后裔结点的祖先
结点的层次:从根结点到树中某结点所经路径上的边数加1称为该结点的层次。根结点的层次规定为1,其他结点的层次就是其双亲结点的层次数加1
树的深度:树中所有结点的层次的最大值称为该树的深度
无序树:如果树中任意结点的各孩子结点的排列没有严格次序,可交换位置,则称该树为无序树
有序树:如果树中任意结点的各孩子结点的排列有严格的次序,不可交换位置,则称该树为有序树。在有序树中,最左边的子树的根结点称为第一个孩子,最右边的称为最后一个孩子
森林:n(n≥0)棵树的集合称为森林
- 树的存储结构
存储树时,既要存储结点的数据元素,又要存储结点之间的逻辑关系。结点之间的逻辑关系有:双亲-孩子关系、兄弟关系。因此,采用树的存储结构主要有双亲表示法、孩子表示法、双亲孩子表示法和孩子兄弟表示法
- 双亲表示法
使用指针表示每个结点的双亲结点,即双亲表示法。每个结点包含两个域:数据域和指针域

- 孩子表示法
使用指针表示出每个结点的孩子结点,即孩子表示法。由于每个结点的孩子结点个数不同,为了简便起见,孩子表示法中的每个结点的指针域个数是树的度

- 孩子兄弟表示法
采用指针既指向每个结点的孩子结点,又指向每个结点的兄弟结点,就是孩子兄弟表示法。指针域包含两个指针,指向孩子结点的指针和指向兄弟结点的指针

二叉树的相关概念
- 二叉树的定义
二叉树是由n(n≥0)个结点组成的有限集合、每个结点最多有两个子树的有序树。它或者是空集,或者是由一个根和称为左、右子树的两个不相交的二叉树组成
- 特点
- 二叉树是有序树,即使只有一个子树,也必须区分左、右子树
- 二叉树的每个结点的度不能大于2,只能取0、1、2三者之一
- 二叉树中所有结点的形态有5种:空结点、无左右子树的结点、只有左子树的结点、只有右子树的结点和具有左右子树的结点
- 二叉树的性质
性质1:二叉树的第i层上最多有2i-1个结点(i≥1)
性质2:深度为k(k≥1)的二叉树上最少有k个结点,最多有2k-1个结点
性质3:对于任一棵非空二叉树,若其叶结点数为n0,度为2的非叶结点数为n2,则n0 = n2 +1
性质4:具有n个结点的完全二叉树的深度为[log2n]+1([]表示向下取整)
性质5:如果将一棵有n个结点的完全二叉树自顶向下,同一层自左向右连续给结点编号1,2,3,...,n,然后按此结点编号将树中各结点顺序的存放于一个一维数组,并简称编号为i的结点为结点i( i≥1 && i≤n),则有以下关系:
- 若 i= 1,则结点i为根,无父结点;若 i> 1,则结点 i 的父结点为结点[i/2]
- 若 2*i≤ n,则结点 i 的左子女为结点 2*i;
- 若2*i≤n,则结点i的右子女为结点2*i+1;
- 若结点编号i为奇数,且i!=1,它处于右兄弟位置,则它的左兄弟为结点i-1;
- 若结点编号i为偶数,且i!=n,它处于左兄弟位置,则它的右兄弟为结点i+1;
- 结点i所在的层次为[log2i]+1。([]表示向下取整)
- 二叉树的存储结构
二叉树的存储结构有顺序存储结构、链式存储结构、仿真指针存储结构
- 顺序存储结构
顺序存储结构采用一维数组存储的
- 链式存储结构
链式存储结构采用链表存储二叉树中的数据元素,用链建立二叉树中结点之间的关系。二叉树最常用的链式存储结构是二叉链,每个结点包含三个域,分别是数据元素域data、左孩子链域lChild和右孩子链域rChild
- 二叉树的遍历
- 前序遍历(DLR)
- 访问根节点
- 访问左子树
- 访问右子树
- 中序遍历(LDR)
- 访问左子树
- 访问根节点
- 访问右子树
- 后序遍历(LRD)
- 访问左子树
- 访问右子树
- 访问根节点

二叉查找树
- 二叉查找树的定义
二叉查找树(又叫作二叉搜索树或二叉排序树)是一种数据结构,采用了图的树形结构。数据存储于二叉查找树的各个结点中。
- 二叉查找树的过程

二叉查找树有两个性质。第一个是每个结点的值均大于其左子树上任意一个结点的值

第二个是每个结点的值均小于其右子树上任意一个结点的值

根据这两个性质可以得到以下结论。首先,二叉查找树的最小结点要从顶端开始,往其左下的末端寻找。此处最小值为3

反过来,二叉查找树的最大结点要从顶端开始,往其右下的末端寻找。此处最大值为28

试着往二叉查找树中添加数据。比如添加数字1

首先,从二叉查找树的顶端结点开始寻找添加数字的位置。将想要添加的1与该结点中的值进行比较,小于它则往左移,大于它则往右移

由于1<9,所以将1往左移

由于1<3,所以继续将1往左移,但前面已经没有结点了,所以把1作为新结点添加到左下方

这样,1的添加操作便完成了

试试添加数字4

和前面的步骤一样,首先从二叉查找树的顶端结点开始寻找添加数字的位置

由于4<9,所以将其往左移

由于4>3,所以将其往右移

由于4<8,所以需要将其往左移,但前面已经没有结点了,所以把4作为新结点添加到左下方

于是4的添加操作也完成了

试试删除结点28

如果需要删除的结点没有子结点,直接删掉该结点即可

再试试删除结点8

如果需要删除的结点只有一个子结点,那么先删掉目标结点……

然后把子结点移到被删除结点的位置上即可

最后来试试删除结点9

如果需要删除的结点有两个子结点,那么先删掉目标结点……

然后在被删除结点的左子树中寻找最大结点……

最后将最大结点移到被删除结点的位置上。这样一来,就能在满足二叉查找树性质的前提下删除结点了。如果需要移动的结点(此处为4)还有子结点,就递归执行前面的操作

看看如何在二叉查找树中查找结点,来试试查找12

从二叉查找树的顶端结点开始往下查找。和添加数据时一样,把12和结点中的值进行比较,小于该结点的值则往左移,大于则往右移

由于12>4,所以往右移

找到结点12了

- 二叉查找树解说
可以把二叉查找树当作是二分查找算法思想的树形结构体现。因为它具有前面提到的那两个性质,所以在查找数据或寻找适合添加数据的位置时,只要将其和现有的数据比较大小,就可以根据比较结果得知该往哪边移动了。
比较的次数取决于树的高度。所以如果结点数为n,而且树的形状又较为均衡的话,比较大小和移动的次数最多就是log2n。因此,时间复杂度为O(logn)。但是,如果树的形状朝单侧纵向延伸,树就会变得很高,此时时间复杂度也就变成了O(n)。

浙公网安备 33010602011771号