算法与数据结构(六)

第四章 树结构

4.1 树结构概念

树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。

树的结点

结点:使用树结构存储的每一个数据元素都被称为“结点”

父结点(双亲结点)、子结点和兄弟结点:对于图 1(A)中的结点 A、B、C、D 来说,A 是 B、C、D 结点的父结点(也称为“双亲结点”),而 B、C、D 都是 A 结点的子结点(也称“孩子结点”)。对于 B、C、D 来说,它们都有相同的父结点,所以它们互为兄弟结点。

树根结点(简称“根结点”):每一个非空树都有且只有一个被称为根的结点。图 1(A)中,结点A就是整棵树的根结点。

树根的判断依据为:如果一个结点没有父结点,那么这个结点就是整棵树的根结点。

叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。例如图 1(A)中,结点 K、L、F、G、M、I、J 都是这棵树的叶子结点, 即度为0的结点。

分支结点 : 度不为0的结点。

子树和空树

子树:如图 1(A)中,整棵树的根结点为结点 A,而如果单看结点 B、E、F、K、L 组成的部分来说,也是棵树,而且节点 B 为这棵树的根结点。所以称 B、E、F、K、L 这几个结点组成的树为整棵树的子树;同样,结点 E、K、L 构成的也是一棵子树,根结点为 E。

注意:单个结点也是一棵树,只不过根结点就是它本身。图 1(A)中,结点 K、L、F 等都是树,且都是整棵树的子树。

知道了子树的概念后,树也可以这样定义:树是由根结点和若干棵子树构成的。

空树:如果集合本身为空,那么构成的树就被称为空树。空树中没有结点。

补充:在树结构中,对于具有同一个根结点的各个子树,相互之间不能有交集。例如,图 1(A)中,除了根结点 A,其余元素又各自构成了三个子树,根结点分别为 B、C、D,这三个子树相互之间没有相同的结点。如果有,就破坏了树的结构,不能算做是一棵树。

结点的度和层次

对于一个结点,拥有的子树数(结点有多少分支)称为结点的度(Degree)。例如,图 1(A)中,根结点 A 下分出了 3 个子树,所以,结点 A 的度为 3。

一棵树的度是树内各结点的度的最大值。图 1(A)表示的树中,各个结点的度的最大值为 3,所以,整棵树的度的值是 3。

结点的层次:从一棵树的树根开始,树根所在层为第一层,根的孩子结点所在的层为第二层,依次类推。对于图 1(A)来说,A 结点在第一层,B、C、D 为第二层,E、F、G、H、I、J 在第三层,K、L、M 在第四层。

一棵树的深度(高度)是树中结点所在的最大的层次。图 1(A)树的深度为 4。

如果两个结点的父结点虽不相同,但是它们的父结点处在同一层次上,那么这两个结点互为堂兄弟。例如,图 1(A)中,结点 G 和 E、F、H、I、J 的父结点都在第二层,所以之间为堂兄弟的关系。

4.2 二叉树的基本定义

二叉树

 树中包含的各个节点的度不能超过 2,每个结点最多有两个子结点 ,即只能是 0、1 或者 2;

二叉树示意图

二叉树的性质

1.  第i层最多有2^{i-1}个结点

2.  二叉树深度为k, 此二叉树最多有2^{k}-1个结点

3. 度为0的结点(叶子结点)个数n{}_{0}, 度为2的结点数为n{}_{2} , 有如下关系 : n{}_{0} = n{}_{2} +1 ;

满二叉树 

 除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。

满二叉树示意图



满二叉树除了满足普通二叉树的性质,还具有以下性质:

  1. 第i层有2^{i-1}个结点
  2.  深度为k, 满二叉树, 叶子数 2^{k-1} 个 ,  一共有 2^{k}-1 个结点
  3. 满二叉树不存在度为1的结点, 每个分支点中都有两颗深度相同的子树,且叶子结点在最底层
  4. n个结点的的满二叉树的深度为log {}_{2} (n+1)

完全二叉树 

如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。


完全二叉树示意图

完全二叉树除了具有普通二叉树的性质,它自身也具有一些独特的性质,比如说,n 个结点的完全二叉树的深度为log {}_{2} (n) +1。

log {}_{2} (n) 取最大整数 log {}_{2} (4)  = 2 ,   而  log {}_{2} (5)  的结果也是2;   

对于任意一个完全二叉树来说,如果将含有的结点按照层次从左到右依次标号(如图 3a)),对于任意一个结点 i ,完全二叉树还有以下几个结论成立:

  1. 当 i>1 时,父亲结点为结点 [i/2] 。(i=1 时,表示的是根结点,无父亲结点)
  2. 如果 2*i>n(总结点的个数) ,则结点 i 肯定没有左孩子(为叶子结点);否则其左孩子是结点 2*i 。
  3. 如果 2*i+1>n ,则结点 i 肯定没有右孩子;否则右孩子是结点 2*i+1 。

二叉查找树

二叉查找树(Binary Sort Tree)是以一棵二叉树来组织的,可以用链表数据结构来表示,

其中,每一个结点就是一个对象,一般地,包含数据值和指向孩子(也可能是父母)的指针。如果某个孩子结点不存在,其指针为空(NULL)

二叉查找树的特点 : 

查找树的左右子树各是一棵查找树
若查找树的左子树非空,则其左子树上的各节点值均小于根节点的值。
若查找树的右子树非空,则其右子树上的各节点值均大于根节点的值。
————————————————

4.3 二叉查找树的实现

 二叉树的实现,也可以通过数组,但是没有链表方便,这里选择链表实现

 二叉树结点类

类名

Node<Key,Value>

构造

Node<Key key,Value  value, Node left, Node right>  创建Node对象

成员变量

public  Key key; 存储键

public  Value  value;存储值

public  Node left;左子结点

public  Node right : 右子结点

代码实现 :

二叉查找树API:

类名BinaryTree<Key extends Comparable<Key>,Value> 
构造

BinaryTree()   创建二叉树对象

成员变量

public  Node root; 存储根结点

public  int   N;存储树结点数

成员方法

1. public void put(Key k, Value  v) ; 向树中插入一个键值对

2. public  Node put(Node x, Key key, Value value) : 给定父节点X, 添加一个新的键值对, 并且返回添加后的新树

3. public Value get(Key key); 根据key从树种取出对应的值

4. public void delete(Key key) 根据key, 删除树种对应的键值对

5. public Node delete(Node x, Key) 删除指定树x上的键为key的键值对,并且返回删除后的新数

6. public int size() ; 获取树中元素的个数

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值