数据结构之树

来源:互联网 发布:小甲鱼零基础学python 编辑:程序博客网 时间:2024/06/05 17:49

1.树的概念

之前我们一直在谈的都是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构——“树”,考虑它的各种特性,来解决我们在编程中碰到的相关问题。

树(Tree)是n个结点的有限集。n=0时称为空树。

在任意一棵非空树中:有且仅有一个特定的称为根(Root)的结点;当n>1时,其余结点可分为m个互不相交的有限集T1、T2、......、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

2.结点分类

树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。

3.结点间关系

结点的子树的根称为该结点的孩子(Child),相应地,该结点称为孩子的双亲(Parent)。

同一个双亲的孩子之间互称兄弟(Sibling)。

结点的祖先是从根到该结点所经分支上的所有结点。反之,以某结点为根的子树中的任一结点都称为该结点的子孙。

结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第I层,则其子树的根就在第I+1层。其双亲在同一层的结点互为堂兄弟。

树中结点的最大层次称为树的深度(Depth)或高度。

4.二叉树

二叉树(Binary Tree)是n个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

5.二叉树特点

每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树都是可以的。

左子树和右子树是有顺序的,次序不能任意颠倒。就像人是双手、双脚,但显然左手、左脚和右手、右脚是不一样的。

即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

6.二叉树具有五种基本形态:

空二叉树

只有一个根结点

根结点只有左子树

根结点只有右子树

根结点既有左子树又有右子树

7.特殊二叉树

斜树:所有的结点都只有左子树的二叉树叫左斜树,所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。斜树有很明显的特点,就是每一层都只有一个结点,结点的个数与二叉树的深度相同。线性表结构可以理解为是树的一种极其特殊的表现形式。

满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。

单是每个结点都存在左右子树,不能算是满二叉树,还必须要所有的叶子都在同一层上,这就做到了整棵树的平衡。因此,满二叉树的特点有:

叶子只能出现在最下一层,出现在其他层就不可能达到平衡

非叶子结点的度一定是2,否则就是“缺胳膊少腿”了

在同样深度的二叉树中,满二叉树的结点个数最多,叶子数也最多

完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这课二叉树称为完全二叉树。

满二叉树一定是一棵完全二叉树,但完全二叉树不一定是满的。

完全二叉树的特点:

叶子结点只能出现在最下两层

最下层的叶子一定集中在左部连续位置

倒数二层,若有叶子结点,一定都在右部连续位置

如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况

同样结点数的二叉树,完全二叉树的深度最小

8.二叉树的性质

性质1:在二叉树的第i层上至多有2^(i-1)个结点

性质2:深度为k的二叉树至多有2^k-1个结点

性质3:对任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0=N2+1

性质4:具有n个结点的完全二叉树的深度为[Log2N]+1

性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号,对任一结点i有:

如果i=1,则结点i为二叉树的根,无双亲;如果i>1,则其双亲是结点[i/2]

如果2i>n,则结点i无左孩子;否则其左孩子是结点2i

如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1

9.二叉树的存储结构

顺序存储结构一般只用于完全二叉树,通常使用二叉链表。

10.二叉树的遍历

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

二叉树遍历方式可以很多,如果我们限制了从左到右的习惯方式,那么主要就分为四种:前序遍历、


0 0
原创粉丝点击