软考(中级数据库)3 数据结构与算法(3.4树与二叉树)

3.4 树与二叉树

3.4.1 树

定义:树是n (n≥0)个节点的有限集合。当n=0时称为空树。在任一非空树中,有且仅有一个称为根的节点:其余节点可分为m (m≥0)个互不相交的有限集T1,T2,...,.其中每个集合又都是一棵树,并且称为根节点的子树。

1、双亲、孩子和兄弟:B的双亲结点是A(只有一个,不要纠结于‘双’),A的孩子节点是B,BCD互为兄弟节点。

2、节点的度:一个节点的子树的个数记为该节点的度。

3、叶子节点:也称为终端节点,指度为零的节点。

4、内部节点:度不为零的节点称为分支节点或非终端节点。除根节点之外,分支节点也称为内部节点。

5、节点的层次:根为第一层,根的孩子在第二层,依此类推。

6、树的高度:一棵树的最大层次数记为树的高度(或深度)。

3.4.2 二叉树

定义:二叉树是n(n≥0)个节点的有限集合,它或者是空树(n=0),或者是由一个根节点及两棵不相交的、分别称为左子树和右子树的二叉树所组成。

树和二叉树的区别:

(1) 二叉树中节点的子树要区分左子树和右子树,即使只有一棵子树,而树中不用区分。

(2) 二叉树中节点的最大度为2,而树中无限制。

 二叉树的性质:(不必死记硬背)

1、二叉树第i (i≥1) 层上至多有2**(i-1)个节点。

2、深度为k的二叉树至多有(2**k)-1个节点(k≥1)。

3、对任何一棵二叉树,若其终端节点数为n0,度为2的节点数为n2,则n0=n2+1。

3.4.3 满二叉树和完全二叉树

满二叉树的定义:若深度为k的二叉树有2k-1个节点,则称其为满二叉树。

完全二叉树:当深度为k、有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号为1~n的节点对应时,称之为完全二叉树。(举个例子)

很容易得到满二叉树一定是完全二叉树。

完全二叉树的性质

设深度为k的完全二叉树共有n个节点,那么可知,除第k层外,其余各层都有最多的节点数。

具有n个节点的完全二叉树的深度为INT(Log2n)+1。(以2为底)

假设有编号为i的节点,则有:

(1) 若i=1,则该节点为根节点,无双亲;若i>1,则该节点的双亲节点为INT(i/2)。

(2)若2i≤n,则该节点的左孩子编号为2i,若2i>n,无左孩子。

(3)若2i+1≤n,则该节点的右孩子编号为2i+1,若2i+1>n,无右孩子。

3.4.4 二叉树的存储结构

(1)顺序存储

右图中,c和d之间有着一空格,d和e之间有两空格,代表了D是B的右子节点、第三层只有D节点这一结构,然后E就自然而然出现在第四层、D的左节点上了。

(2)链式存储

二叉链表比较好理解,三叉链表比二叉链表多了一个存储双亲结点的位置。

3.4.5 二叉树的遍历

(花里胡哨,考前复习一下就行,平时不用背)

 依据访问根节点次序的不同,可分为前序遍历法、中序遍历法、后序遍历法。

(1)中序遍历法:(左、根、右)

A、中序遍历根的左子树。
B、访问根节点。
C、中序遍历根的右子树。

依此类推。

(2)前序遍历法:先访问根节点(根、左、右)。

(3)后序遍历法:后访问根节点(左、右、根)。

(4)层序遍历法:按层从上至下、每层从左至右的顺序遍历。

举例:(1) 中序遍历法(左、根、右):BAC > (BD)A(ECF) > B(GD)AEC(HFI) > BGDAECHFI

             (2)    前序遍历法(根、左、右):  ABC > A(BD)(CEF) > AB(DG)CE(FHI) >  ABDGCEFHI

             (3)    后序遍历法(左、右、根):  BCA > (DB)(EFC)A > (GD)BE(HIF)CA > GDBEHIFCA

3.4.6 最优二叉树

最优二叉树又称哈夫曼树,是一类带权路径长度最短的树。

权:是一个人为的概念,表示计算机对每个节点的访问频率。

路径长度:是每一个结点到根节点的路径的长度。

节点的带权路径长度:是指从该节点到根节点之间的路径长度与该节点权的乘积。

树的带权路径长度为树中所有叶子节点的带权路径长度之和。

 构造最优二叉树的哈夫曼方法:

(1)根据给定的n个权值{w1, w2,wn}构成n棵二叉树的集合F={T1, T2, ... Tn},其中每棵树Ti只有一个带权为wi的根节点,其左右子树均空。

(2)在F中选取两棵根节点的权值最小的树作为左右子树,构造一棵新的二叉树,置新构造二叉树的根节点的权值为其左、右子树根节点的权值之和。

(3)从F中删除这两棵树,同时将新得到的二叉树加入到F中。重复(2)(3) 步,直到F中只含一棵树时为止, 这棵树便是最优二叉树(哈夫曼树)。

例:现在有一组权值{30,25,15,22,8},下面我们来演示利用这组权值构造最优二叉树(哈夫曼树)的过程。

具体做法如下:找出其中最小的两个8、15,加起来等于23,现在有四个{22,23,25,30}。然后继续找到22、23,构建成45,这里的23是刚得到的新值,所以像构建了两层树。接下是{25,30,45},明显应该是25加30,与刚才的45无关,所以右边另建一支树,最后得到55和之前的45加起来即可。

3.4.7 二叉查找树

二叉查找树又称为二叉排序树。它或者是一棵空树,或者是具有如下性质的二叉树:

(1) 若它的左子树非空,则左子树上所有节点的关键码值均小于根节点的关键码值。

(2) 若它的右子树非空,则右子树上所有节点的关键码值均大于根节点的关键码值。

(3) 左、右子树本身就是两棵二叉查找树。

对二叉查找树进行中序遍历,可得到一个关键码递增有序的节点序列。

二叉查找树的作用:使用二叉查找树来查找树中的数值比普通的二叉树更为方便。



二叉查找树的查找操作递归实现

(1)从根节点开始查找,如果树为空,则返回NULL, 否则,若根节点的关键码值等于查找的值,则查找成功。

(2)否则,若小于根节点的码值,则查找其左子树,若大于根节点的关键码值,则查找其右子树。

 




 





 




 








 

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值