树和二叉树(二)

来源:互联网 发布:linux怎么重启网卡 编辑:程序博客网 时间:2024/06/04 19:24

树和二叉树(二)

今天介绍一下常见的二叉树:

二叉排序树(查找二叉树)

定义:一棵查找二叉树要么是一棵空树,要么满足以下条件:

1、查找树的左右子树各是一棵查找树;

2、若查找树的左子树非空,则其左子树的各结点值均小于根结点值;

3、若查找树的右子树非空,则其右子树的各结点值均大于根结点值;

基本操作:查找;插入结点;删除结点

查找:就是从根结点开始与键值(key)比较,若键值较小则进入左子树,反之进入右子树,重复比较,直到键值等于结点的值。

插入结点:①如果相同键值的结点已在查找二叉树中,则不再插入。

                    ②如果查找二叉树为空树,则以新结点为查找二叉树。

                    ③将要插入结点的键值与插入后的父结点的键值比较,就能确定新结点是父结点的左子结点还是右子结点,并进行相应插入。

删除结点:①若待删除的结点P是叶子结点,则直接删除该结点。

                    ②若待删除的结点P只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点P。

                    ③若待删除的结点P有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点S,用结点S的值代替结点P的值,然后删除结点P的值


最优二叉树(哈弗曼树)

需要知道的概念:树的路径长度、权、结点的带权路径长度(路径长度乘以权值)、树的带权路径长度(所有叶子结点带权路径长度之和)

最优二叉树的定义:带权路径长度最小的树

构造哈弗曼树的过程:

例:假设一组权值为{5, 29, 7, 8, 14, 23, 3, 11},构造哈弗曼树的过程如下:

第一步:以这8个权值作为根结点的权值构造具有8棵树的森林;

第二步:从中选择两个根的权值最小的树3, 5作为左右子树构造一棵新树,并将这两棵树从森林中删除,并将新树添加进去;

第三步:重复第二步过程,注意新树的根也要比较,直到森林中只有一棵树为止;

哈弗曼树的一个特征:只有叶子结点和度为2的结点

线索二叉树

为什么要有线索二叉树:

普通二叉树的结点存储结构为:

LchildDateRchild叶子结点的左右指针都为空,造成存储空间的浪费

 线索二叉树利用了叶子结点的空指针,左指针域指向前驱,右指针域指向后继,这两个指针称为线索

线索二叉树的表示:

LbitLchildDateRchildRbit 对标志域规定如下:

Lbit=0, Lchild是通常的指针

Lbit=1, Lchild是线索

Rbit=0, Rchild是通常的指针

Rbit=1, Rchild是线索

如何将二叉树转化为线索二叉树:

构造前序线索二叉树,中序线索二叉树,后序线索二叉树。

1、对树进行遍历,结点的前驱是左边字母,后继是右边字母

2、将空结点的左右指针按遍历顺序进行连线,所得到的的二叉树就是线索二叉树

线索二叉树的一个特征:若某结点父结点没有右孩子,则该结点后继是父结点


平衡二叉树

定义:平衡二叉树要么是空树,要么是一棵这样的树:

树中任一结点的左、右子树的深度相差不超过1。

平衡二叉树的构造

在一棵二叉查找树中插入结点后,调整其为平衡二叉树。若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树

1.调整方法

(1)插入点位置必须满足二叉查找树的性质 ,即任意一棵子树的左结点都小于根结点,右结点大于根结点

(2)找出插入结点后不平衡的最小二叉树 进行调整,如果是整个树不平衡,才进行整个树的调整。

2.调整方式

(1)LL型

LL型:插入位置为左子树的左结点,进行向右旋转

由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1变为2,成为不平衡的最小二叉树根结点。此时A结点顺时针右旋转,旋转过程中遵循“旋转优先”的规则,A结点替换D结点成为B结点的右子树,D结点成为A结点的左孩子。

(2)RR型

RR型:插入位置为右子树的右孩子,进行向左旋转

由于在A的右子树C的右子树插入了结点F,A的平衡因子由-1变为-2,成为不平衡的最小二叉树根结点。此时,A结点逆时针左旋转,遵循“旋转优先”的规则,A结点替换D结点成为C的左子树,D结点成为A的右子树。

(3)LR型

LR型:插入位置为左子树的右孩子,要进行两次旋转,先左旋转,再右旋转;第一次最小不平衡子树的根结点先不动,调整插入结点所在的子树,第二次再调整最小不平衡子树。

 

 由于在A的左子树B的右子树上插入了结点F,A的平衡因子由1变为了2,成为不平衡的最小二叉树根结点。第一次旋转A结点不动,先将B的右子树的根结点D向左上旋转提升到B结点的位置然后再把该D结点向右上旋转提升到A结点的位置

(4)RL型

RL型:插入位置为右子树的左孩子,进行两次调整,先右旋转再左旋转;处理情况与LR类似。






原创粉丝点击