码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构 -树和二叉树

时间:2015-04-30 10:46:44      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:非线性   二叉树   结构   集合   存储   

树的主要内容

   树型结构:非线性结构,以分支关系定义的层次结构。
    主要内容:
         树和二叉树的概念、性质
         二叉树的存储
         二叉树的遍历
         线索二叉树
         树与二叉树的转化
         Huffman树(最优树)

树的定义

树(Tree)是n(n≧0)个结点的有限集合T,若n=0时称为空树,否则:
⑴ 有且只有一个特殊的称为树的根(Root)结点;
⑵ 若n>1时,其余的结点被分为m(m>0)个互不相交的子集 T1, T2, T3…Tm,其中每个子集本身又是一棵树,称其为根的子树(Subtree)。
这是树的递归定义,即用树来定义树,只有一个结点的树仅由根组成。

树的基本术语

⑴ 结点(node):一个数据元素及其若干指向其子树的分支(指针)。
⑵ 结点的度(degree) :结点所拥有的子树的棵数
(3)树的度: 树中结点度的最大值。
(4) 叶子(leaf)结点:树中度为0的结点,又称为终端结点。
(5) 非叶子结点:度不为0的结点,又称为非终端结点或分支结点)。除根结点外,分支结点又称为内部结点。
(6) 孩子结点、双亲结点、兄弟结点
一个结点的子树的根称为该结点的孩子结点(child)或子结点;
相应地,该结点是其孩子结点的双亲结点(parent)或父结点。
同一双亲结点的所有子结点互称为兄弟结点
(7) 层次:规定树中根结点的层次为1,其余结点的层次等于其双亲结点的层次加1。
若某结点在第l(l≧1)层,则其子结点在第l+1层。
(8) 堂兄弟结点:双亲结点在同一层上的所有结点.
在图6-1(b)中结点E、F、G、H、I、J。
(9) 结点的层次路径: 从根结点开始,到达某结点p所经过的所有结点 (有且只有一条)。
(10) 祖先:结点p的层次路径上的所有结点(p除外) 。
(11) 子孙(descent) :以某一结点为根的子树中的任意结点 。
(12) 树的深度(depth):树中结点的最大层次值, 在图6-1(b)中树的高度为4。
(13) 有序树和无序树:若将树中各结点的子树(若有)看成从左至右室有次序的(即不能互换),则该树称为有序树,否则称为无序树。
在有序树中,最左边的子树的根称为第一个孩子,最右边的称为最后一个孩子。
(14)森林(forest):m(m≧0)棵互不相交的树的集合。
若将一棵树的根结点删除,剩余的子树就构成了森林。

树的抽象数据类型定义

ADT Tree{
数据对象D:D是具有相同数据类型的数据元素的集合。
数据关系R:若D为空集,则称为空树;
……
基本操作:
……
} ADT Tree

二叉树的定义

1 二叉树的定义
二叉树是n(n≥0)个结点的有限集合。n=0时称为空树,否则:
⑴ 有且只有一个特殊的称为树的根(Root)结点;
⑵ 若n>1时,其余的结点被分成为二个互不相交的子集T1,T2,分别称之为左、右子树,并且左、右子树又都是二叉树。

二叉树的定义是递归的。
说明:
1、二叉树每个结点最多有两棵子树,所有结点的度都不超过2;
2、左子树和右子树有顺序之分,次序不能颠倒;即使某结点只有一棵子树,也要区分左右。
二叉树在树结构中起着非常重要的作用。因为二叉树结构简单,存储效率高,树的操作算法相对简单,且任何树都很容易转化成二叉树结构。
以上引入的有关树的术语也都适用于二叉树。

满二叉树

满二叉树的特点:
满二叉树的所有的分支结点都有左、右子树;
所有的叶子结点都在只能出现在最下层;
非叶子结点的度一定是2;
在同样深度的二叉树中,满二叉树的结点数最多,叶子结点最多(即每一层上的结点数达到最大);

完全二叉树

完全二叉树(Complete Binary Tree):
对一颗具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则该二叉树称为完全二叉树。

说明:
深度为k的满二叉树中编号从1到n的前n个结点构成了一棵深度为k的完全二叉树, 其中2k-1 ≦ n≦2k-1 。
完全二叉树是满二叉树的一部分,而满二叉树是完全二叉树的特例。
完全二叉树的特点:
叶子结点只能出现在最下两层;
最下层的叶子结点一定集中在左边连续位置;
倒数第二层若有叶子结点,一定都在右边连续位置;
如果结点度=1,则该结点只有左孩子,即不存在只有右子树的情况;
同样结点树的二叉树,完全二叉树的深度最小;
对于任一结点,如果其右子树的最大层次为l,则其左子树的最大层次为l或l+1。

二叉树性质及其证明

性质1:在非空二叉树中,第i层上至多有2i-1个结点(i1)。

证明:用数学归纳法证明。
    当i=1时:只有一个根结点,21-1=20 =1,命题成立。
    现假设对i>1时,处在第i-1层上至多有2(i-1)-1个结点。
    由归纳假设知,第i-1层上至多有2i-2个结点。由于二叉树每个结点的度最大为2,故在第i层上最大结点数为第i-1层上最大结点数的2倍。
        即   2×2i-22i-1                 
证毕
性质2:深度为k的二叉树至多有2k-1个结点(k≧1) 。

证明:深度为k的二叉树的最大的结点数为二叉树中每层上的最大结点数之和。
    由性质1知,二叉树的第1层、第2层?第k层上的结点数至多有: 20、21 …2k-1 。
    ∴  总的结点数至多有: 20+21+ …+2k-1=2k-1     
证毕
 性质3:对任何一棵二叉树,若其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。
证明:设二叉树中度为1的结点数为n1,二叉树中总结点数为N,因为二叉树中所有结点均小于或等于2,则有:N=n0+n1+n2
   再看二叉树中的分支数:除根结点外,其余每个结点都有唯一的一个分支进入,设B为二叉树中的分支总数,则有:N=B+1。 
   而所有这些分支都是由度为12的结点发出的,所以:B=n1+2?n2          
      ∴         N=B+1=n1+2?n2+1 
     ∴           n0+n1+n2=n1+2?n2+1 
      即          n0=n2+1                                                 证毕
性质4:n个结点的完全二叉树深度为:?㏒2n? +1。
 其中符号: ?x?表示不大于x的最大整数(下整数)。
            ?x? 表示不小于x的最小整数(上整数)。
证明:假设完全二叉树的深度为k,则根据性质2及完全二叉树的定义有:
2k-1-1<n≦2k-1  或   2 k-1≦n<2k
    取对数得:k-1<=㏒2n<k  因为k是整数。
    ∴  k= ?㏒2n? +1                   
证毕
性质5:若对一棵有n个结点的完全二叉树(深度为?㏒2n? +1)的结点按层(从第1层到第?㏒2n? +1层)序自左至右进行编号,则对于编号为i1i≦n)的结点:
⑴ 若i=1:则结点i是二叉树的根,无双亲结点;若i>1,则其双亲结点编号是 ?i/2? 。
⑵ 如果2i>n:则结点i为叶子结点,无左孩子;否则,其左孩子结点编号是2i。
⑶ 如果2i+1>n:则结点i无右孩子;否则,其右孩子结点编号是2i+1。

  证明:用数学归纳法证明。首先证明⑵和⑶,然后由⑵和⑶导出⑴。
    当i=1时,由完全二叉树的定义知,结点i的左孩子的编号是2,右孩子的编号是3。
  若2>n,则二叉树中不存在编号为2的结点,说明结点i的左孩子不存在。
  若3>n,则二叉树中不存在编号为3的结点,说明结点i的右孩子不存在。
    现假设对于编号为j(1ji)的结点,(2)和(3)成立。即:
◆ 当2j≦n :结点j的左孩子编号是2j;当2j>n时,结点j的左孩子结点不存在。
◆ 当2j+1≦n :结点j的右孩子编号是2j+1;当2j+1>n时,结点j的右孩子结点不存在。

数据结构 -树和二叉树

标签:非线性   二叉树   结构   集合   存储   

原文地址:http://blog.csdn.net/wangzi11322/article/details/45390575

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!