树和二叉树

树和二叉树

  1. 树的定义

树(Tree)是由n(n≥0)个结点构成的有限集合。结点数为0的树称为空树,结点数大于0的树称为非空树

相关概念解释:

结点:由数据元素和构造数据元素之间关系的指针组成

image-20200801154443478

叶子结点和分支结点:将度为0的结点称为叶子结点,又称为终端结点。将度不为0的结点称为分支结点,又称为非终端结点(有一个孩子节点就是度为1,有两个孩子结点就是度为2,没有孩子结点就是度为0)。

孩子结点和双亲结点:某结点子树的根结点称为该结点的孩子结点。该结点称为孩子结点的双亲结点。

兄弟结点:具有同一双亲的结点互为兄弟结点

后裔和祖先:一个结点的所有子树上的任何结点都是该结点的后裔。该结点称为这些后裔结点的祖先

结点的层次:从根结点到树中某结点所经路径上的边数加1称为该结点的层次。根结点的层次规定为1,其他结点的层次就是其双亲结点的层次数加1

树的深度:树中所有结点的层次的最大值称为该树的深度

无序树:如果树中任意结点的各孩子结点的排列没有严格次序,可交换位置,则称该树为无序树

有序树:如果树中任意结点的各孩子结点的排列有严格的次序,不可交换位置,则称该树为有序树。在有序树中,最左边的子树的根结点称为第一个孩子,最右边的称为最后一个孩子

森林:n(n≥0)棵树的集合称为森林

  1. 树的存储结构

存储树时,既要存储结点的数据元素,又要存储结点之间的逻辑关系。结点之间的逻辑关系有:双亲-孩子关系、兄弟关系。因此,采用树的存储结构主要有双亲表示法、孩子表示法、双亲孩子表示法和孩子兄弟表示法

  • 双亲表示法

使用指针表示每个结点的双亲结点,即双亲表示法。每个结点包含两个域:数据域和指针域

image-20200801155320611

  • 孩子表示法

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

image-20200801155455516

  • 孩子兄弟表示法

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

image-20200801155640277

二叉树的相关概念

  1. 二叉树的定义

二叉树是由n(n≥0)个结点组成的有限集合、每个结点最多有两个子树的有序树。它或者是空集,或者是由一个根和称为左、右子树的两个不相交的二叉树组成

  1. 特点
  • 二叉树是有序树,即使只有一个子树,也必须区分左、右子树
  • 二叉树的每个结点的度不能大于2,只能取0、1、2三者之一
  • 二叉树中所有结点的形态有5种:空结点、无左右子树的结点、只有左子树的结点、只有右子树的结点和具有左右子树的结点
  1. 二叉树的性质

性质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。([]表示向下取整)
  1. 二叉树的存储结构

二叉树的存储结构有顺序存储结构、链式存储结构、仿真指针存储结构

  • 顺序存储结构

顺序存储结构采用一维数组存储的

  • 链式存储结构

链式存储结构采用链表存储二叉树中的数据元素,用链建立二叉树中结点之间的关系。二叉树最常用的链式存储结构是二叉链,每个结点包含三个域,分别是数据元素域data、左孩子链域lChild和右孩子链域rChild

  1. 二叉树的遍历
  • 前序遍历(DLR)
  1. 访问根节点
  2. 访问左子树
  3. 访问右子树
  • 中序遍历(LDR)
  1. 访问左子树
  2. 访问根节点
  3. 访问右子树
  • 后序遍历(LRD)
  1. 访问左子树
  2. 访问右子树
  3. 访问根节点

image-20200801163106173

二叉查找树

  1. 二叉查找树的定义

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

  1. 二叉查找树的过程

image-20200803091935053

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

image-20200803092103854

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

image-20200803092129646

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

image-20200803092155809

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

image-20200803092216452

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

image-20200803092239751

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

image-20200803092319921

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

image-20200803092337902

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

image-20200803092355101

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

image-20200803092414181

试试添加数字4

image-20200803092436605

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

image-20200803092455545

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

image-20200803092513191

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

image-20200803092530136

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

image-20200803092550172

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

image-20200803092607108

试试删除结点28

image-20200803093344779

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

image-20200803093413814

再试试删除结点8

image-20200803093443638

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

image-20200803093502573

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

image-20200803093529787

最后来试试删除结点9

image-20200803093547244

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

image-20200803093605400

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

image-20200803093623756

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

image-20200803093646552

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

image-20200803094049429

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

image-20200803094114289

由于12>4,所以往右移

image-20200803094139370

找到结点12了

image-20200803094154040

  1. 二叉查找树解说

可以把二叉查找树当作是二分查找算法思想的树形结构体现。因为它具有前面提到的那两个性质,所以在查找数据或寻找适合添加数据的位置时,只要将其和现有的数据比较大小,就可以根据比较结果得知该往哪边移动了。

比较的次数取决于树的高度。所以如果结点数为n,而且树的形状又较为均衡的话,比较大小和移动的次数最多就是log2n。因此,时间复杂度为O(logn)。但是,如果树的形状朝单侧纵向延伸,树就会变得很高,此时时间复杂度也就变成了O(n)。

posted @ 2020-08-01 16:37  乌利乌利  阅读(57)  评论(0)    收藏  举报