树和二叉树介绍

戏子无情 提交于 2020-02-28 17:56:56


树形结构 是数据元素(结点)之间有分支,并且具有层次关系的结构,可用于表示数据元素之间存在的一对多关系。
树(Tree) 是由n(n≥0)个结点构成的有限集合,当n=0时称为空树。若树非空,则具有以下两个性质:
(1)有且仅有一个特定的结点,称为根(Root)。
(2)其余的结点可分为m个互不相交的集合T1,T2,…,Tm,其中每一个集合都是一棵树,并且称为根的子树( Subtree)。
如下图所示是有13个结点的树,A是根,其余结点分成三个互斥的集合T1={B,E,F,K,L}、T2={C,G}、T3={D,H,I,J,M},T1、T2、T3都是A的子树,其本身也是一棵树。
在这里插入图片描述树形结构图
树的基本术语:
树结点( Tree Node) :树中一个独立单元。包含一个数据元素及若干指向其子树的分支,如上图中的A、B、C、D等。
树根(Root) :树中唯一没有前驱的结点,如上图中的A结点。
结点的度( Node Degree) :结点拥有的子树数,称为结点的度。例如,在上图中A的度为3,B的度为2,K的度为0。
树的度( Tree Degree) :树中各结点的度的最大值。如上图中树的度为3。
树叶(Leaf) :度为0的结点。例如,在图中,K、L、F、G、1、J、M都是树叶,也称叶结点。除根和叶子以外的其他结点称为中间结点。
双亲( Parent)和孩子( Child) :把一个树结点的直接前驱称为该结点的双亲;反之;把一个树结点的所有直接后继称为该结点的孩子。例如,上图中,结点B是结点A的孩子,结点A是结点B的双亲。
兄弟( Sibling) :同一双亲的孩子之间互称为兄弟。例如,上图中,结点K、L互为兄弟,结点H、I、J互为兄弟。将这些关系进一步推广,结点的祖先就是从根到该结点的所经分支上的所有结点。以某结点为根的子树中的任一结点都称为该结点的子孙。此外双亲在同一层上的结点互为堂兄弟.
树的层次( Level)和深度( Depth) :从根算起,根为第一层,根的孩子为第二层,树中任一结点的层次等于它的双亲的层次加1。树中各结点层次的最大值称为树的深度或高度。例如,上图中的树的深度为4。
有序树和无序树( Ordered Tree8。 Unordered Tree) :如果树中结点的各子树可看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树。在有序树最左边子树的根称为第一孩子,最右边子树的根称为最后一个孩子。
森林( Forest) :m(m≥0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。由此也可以以森林和树的相互递归定义来描述树。
二叉树
二叉树 就是度为2的有序树,是最重要的一种树形结构。二又树的存储和处理比普通树简单,同时普通树都可以方便地转化为二又树来存储和处理。
二叉树( Binary Tree) 是一种特殊的树形结构。定义如下:
(1)由n(n≥0)个结点所构成的集合,此集合可以为空。
(2)二叉树的根结点下可分为两个互不相交的子树,子树有左右之分,次序不能任意颠倒,称为左子树和右子树:且左右子树均为二叉树。
在这里插入图片描述二叉树结构

二叉树是有序树的特例,具有下列重要性质:
性质1、在二叉树的第i层上至多有2^(i-1)个结点(i>=1)。
性质2、深度为k的二叉树至多有2^(k) - 1个结点,(k>=1)。
性质3、对任何一颗二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1;
性质4、具有n个结点的完全二叉树的深度为 (logn以2为底的对数 + 1) 。
性质5、如果对一棵有n结点的深度为(logn以2为底的对数 + 1) ,完全二叉树的结点按层序编号,同层按从左至右,则对任一结点i(1 ≤ i ≤ n)。于是有:
(1)如果=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲 PARENT(i)是结点i/2。
(2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则,其左孩子 LCHILD(i)是结点2i。
(3)如果2i+1>n,则结点i无右孩子;否则,其右孩子 RCHILD(i)是结点2i+1。
在这里插入图片描述
一棵深度为k且有2^k - 1个结点的二叉树称为 满二叉树 。满二叉树的特点是每一层上的结点数都是最大结点数。
对满二叉树的结点进行连续编号,约定编号从根结点起,自上而下,自左至右。由此可引出完全二叉树的定义。深度为k、有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1~n的结点一一对应时,称为 完全二叉树 。如上图所示完全二叉树具有的特点是:
(1)叶子结点只可能在层次最大的两层上出现。
(2)对任一结点,若其右分支下的子孙的最大层次为r,则其左分支下的子孙的最大层次必为r或r+1。
二叉树的存储结构
顺序存储结构
用一组地址连续的存储单元存储二叉树中的各个结点。为了便于对二叉树结点进行查找或处理,存储时需要将普通二叉树的各个结点按照它们在完全二叉树的对应结点位置依次存放到数组相应的存储单元中。如图所示,二又树的顺序存储结构定义如下:
在这里插入图片描述
一般来说,顺序存储结构只适用于完全二叉树或满二叉树的存储,因为普通二叉树采用顺序存储结构进行存储时,将导致存储单元的浪费。最坏情况下,对于一个深度为k且只有k个结点的右支树来说,存储时需要2^k-1个存储单元。
链式存储结构
采用链式存储结构存储二叉树时,可以根据树中的结点数动态申请所需要的结点,从而避免存储空间的浪费。
由二叉树的定义可知,每个二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支组成。因此,定义二叉树的结点结构时至少应包含三个域:数据域和左、右指针域。其中,数据域保存结点的信息左指针域存放指向其左子树根的信息右指针域存放指向其右子树根的信息,如下图所示。有时,为了便于找到结点的双亲,则可在上述结点结构中增加一个指向其双亲结点的指针域,如下图所示。利用这两种结点结构所得的二叉树的存储结构分别称为二又链表和三又链表。如下图所示二叉树的链式存储结构。
在这里插入图片描述
在这里插入图片描述
二叉树的遍历
二叉树的遍历 是指按照一定次序访问树中所有结点,并且每个结点仅被访问一次的过程。它是二叉树最基本的运算,也是二叉树中所有其他运算的基础。遍历二叉树的实质是对二叉树的线性化过程,即遍历的结果是将非线性结构的树中结点排成一个线性序列,二叉树的遍历按访问根结点的先后次序不同,可分为 先序遍历、中序遍历 、 后序遍历和层次遍历 。
在这里插入图片描述
转自(https://www.jianshu.com/p/c545c93f2585)https://www.jianshu.com/p/c545c93f2585

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!