数据结构_树与二叉树(2)

二叉排序树

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

  1. 若左子树非空,则左子树上的所有结点关键字均小于根节点的关键字值。
  2. 若右子树非空,则右子树上的所有结点关键字值均大于根节点的关键字值。
  3. 左、右子树本身也分别是一棵二叉排序树。
    对二叉排序树进行中序遍历,可以得到一个递增的有序序列。

查找操作

二叉排序树的查找是从根节点开始,沿某一个分支逐层向下进行比较。若二叉排序树非空,将给定值与根节点的关键字比较,若相等,则查找成功;若不等,则当根节点的关键字大于给定关键字值时,在根节点的左子树中查找,否则,在右子树中查找。(和二分查找步骤相似) 使用递归

非递归查找:

BSTNode *BST_Search(BiTree T, Elemtype key, BSTNode *&p) {
	p = NULL;	//p指向被查找结点的双亲,用于插入和删除操作中
	while (T != NULL && T.data != key) {
		p = T;
		if(key < T.data)
			T = T.lchild;
		else
			T = T.rchild;
	}
	return T;
}

插入操作

二叉排序树作为一种动态集合,其特点是树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。
插入的方法:若原二叉排序树为空,则直接插入结点;否则,若关键字k小于根节点关键字,则插入到左子树中,若关键字k大于根节点关键字,则插入到右子树中。

删除操作

删除操作:
删除指定节点后,树中剩余节点的中序遍历还是有序的,就ok。

查找效率

最好的情况:左右子树高度之差不超过1,这时候平均查找长度达到O( l o g 2 n log_2n log2n)
最坏的情况:所有结点只有左子树或者只有右子树,这时候平均查找长度为O( n n n)

平衡二叉树

定义

任意节点的左右子树高度差的绝对值不超过1,将这样的二叉树称为平衡二叉树。简称平衡树(AVL树)。定义节点左子树和右子树的高度差为该节点的平衡因子,则平衡二叉树的平衡因子只可能是-1,0,1.

插入操作

二叉排序树保证平衡的基本思想:每当在二叉排序树中插入或者删除一个节点时,首先要检查其插入路径上的节点是否因为此次操作导致了不平衡。如果导致了不平衡,则先找到插入路径上离插入点最近的平衡因子大于1的结点A,再对以A为根的子树,在保持二叉排序树的特性的前提下,调整各节点的位置关系,使之重新达到平衡。

平衡二叉树调整规律:
(1)LL平衡旋转
在结点A的左孩子(L)的左子树(L)上插入新节点,树失去平衡,需要向右旋转。将A结点的左子树B向右上旋转代替A成为根节点,将A节点向右下旋转成为B的柚子树的根节点,而B的原右子树则作为A的左子树。
在这里插入图片描述

(2)RR平衡旋转
在这里插入图片描述

(3)LR平衡旋转
在这里插入图片描述

(4)RL平衡旋转

在这里插入图片描述

查找

N h N_h Nh表示深度为 h h h的平衡树中含有的最少结点数。 N 0 = 0 , N 1 = 1 , N 2 = 2 , N_0=0,N_1=1,N_2=2, N0=0,N1=1,N2=2,并且有== N h = N h − 1 + N h − 2 + 1 N_h=N_{h-1}+N_{h-2}+1 Nh=Nh1+Nh2+1。平衡二叉树的平均查找长度为O( l o g 2 n log_2n log2n)。

哈夫曼树和哈夫曼编码

树中结点被赋予一个表示某种意义上的数值,称为该结点的权。从树根节点到任意结点的路径长度(经过的边数)与该节点上的权值的乘积称为该结点的带权路径长度。
在含有N个带权叶子结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也成为最优二叉树。
如果没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值