神奇少年的数据结构学习笔记五(树)

1.树的定义:

树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在n>0时,在任意一颗非空的树中

  1. 有且仅有一个特定的称为根(Root)的结点,它没有直接前驱,但有零个或多个直接后驱;
  2. 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T_{}1,T_{}2.....T_{}M,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree),每个子树的根节点有且只有一个直接前驱,但有零个或多个直接后驱;

结点的概念

  1. 结点 :包含一个数据元素及若干指向其他结点的分支。
  2. 结点的度:一个结点的子树个数。
  3. 分支结点:度不为0的结点,又称非终端结点
  4. 终端结点:度为0都结点,又称叶结点
  5. 结点的层次:从根开始,根为第一层,根的子结点为第二层,以此类推。
  6. 结点之间的关系:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲结点。同一个双亲的孩子之间互称兄弟结点。结点的祖先是从根到该结点所经分支上的所有结点。对于上图 H来说 E,B,A都是它的祖先。反之,以某结点为根的子树的任一结点都是该结点的子孙。

   树的概念

  1. 树的度:树内所有结点的度的最大值。
  2. 树的高度:树中结点层次的最大值为树的深度或高度。比如上图的高度就是4.
  3. 有序树:将树中各子树看成从左到右是有次序的,不能互换的,则称该树为有序树,否则是无序树。
  4. 森林:m(m>=0)颗互不相交的树的集合,对树中的每个结点而言,其子树的集合即为森林。

线性结构和树结构对比
线性结构 树结构
第一个数据元素:无前驱 根节点:无双亲,唯一
最后一个数据元素:无后驱 叶结点:无孩子,可以多个
中间元素:一个前驱一个后驱 中间结点:一个双亲多个孩子

 

2.二叉树的定义:

  1. 每个结点的度都不大于2
  2. 每个结点的孩子结点次序不能任意颠倒

由此得出:二叉树的每个结点0、1或2个子树,且有左右之分,左边的是左子树,右边的是右子树

二叉树有五种基本形态

  1. 空二叉树
  2. 只有一个根结点
  3. 根结点只有左子树
  4. 根结点只有右子树
  5. 根结点既有左子树又有右子树

特殊二叉树

  1. 斜树:每层只有一个结点
  2. 满二叉树:所有的分支结点都存在左子树和右子树,并且所有的叶子都在同一层上
  3. 完全二叉树:按照满二叉树的顺序而出现,中间没有空隙

左斜树和右斜树

神奇少年的数据结构学习笔记五(树)_第1张图片神奇少年的数据结构学习笔记五(树)_第2张图片

满二叉树和完全二叉树

神奇少年的数据结构学习笔记五(树)_第3张图片

二叉树的性质

  1. 在二叉树的第i层上至多有2^{i-1}个结点(i>=1)
  2. 深度为k的二叉树至多有2^{k}-1个结点(k>=1)
  3. 对任何一颗二叉树T,如果其终端结点数为n_{0},度为2的结点数为n_{2},则n_{0}=n_{2}+1
  4. 具有n个结点的完全二叉树的深度为(log_{2}n)+1
  5. 对于一颗有n个结点的完全二叉树 ,对于任意结点有: 1.如果i=1,则i是二叉树的根,无双亲;如果i>1,则其双亲是结点(i/2); 2.如果2i>n,则结点i无左子树;否则其左子树是结点2i;  3.如果2i+1>n。则结点i无左右子树;否则其右子树是结点2i+1;

3.二叉树的存储结构

1.顺序存储结构

二叉树之间是有顺序的,所有数组的下标足够提醒二叉树之间的顺序关系,结点为空的设置一个不存在的值就可以了,但是比如下图的情况的话,空白的结点都要占用存储空间,所以顺序存储结构一般只适用于完全二叉树。

 

神奇少年的数据结构学习笔记五(树)_第4张图片

2.二叉树的链式存储结构

二叉树的每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。(如果有需要,还可以加上指向双亲的指针域,那样称为三叉链表)

lchild data rchild

 

data是数据域,lchild和rchild都是指针域,分别存放左子树和右子树的指针。   

4.遍历二叉树

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问且仅被访问一次。

二叉树的遍历方法

  1. 前序遍历 :若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树;例顺序为:ABDGHCEIG      神奇少年的数据结构学习笔记五(树)_第5张图片       

     

                             
  2. 中序遍历:若二叉树为空,则空操作返回,否则从根结点开始,中序遍历根结点的左子树,然后访问根结点,最后中序遍历右子树;例顺序为:GDHBAEICF      神奇少年的数据结构学习笔记五(树)_第6张图片神奇少年的数据结构学习笔记五(树)_第7张图片
  3. 后序遍历:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点;例顺序为:GHDBIEFCA             神奇少年的数据结构学习笔记五(树)_第8张图片                              
  4. 层序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后从上而下逐层遍历,同一层按从左到右的顺序对结点逐个访问;例顺序为:ABCDEFGHI 神奇少年的数据结构学习笔记五(树)_第9张图片

 

说得再多关看文章或视频是不能完全理解应用树的结构的,还是要多刷一下算法题,才能更深一步的理解

你可能感兴趣的:(数据结构笔记,二叉树,算法,数据结构)