树(二叉搜索树/平衡二叉树)

一、二叉搜索树(BST)

二叉搜索树(Binary Search Tree),也称二叉排序树或二叉查找树。
二叉搜索树:是一颗二叉树,可以为空;若不为空,满足一下性质:
(1) 非空左子树的所有键值小于其根节点的键值
(2) 非空右子树的所有键值大于其根节点的键值
(3) 左右子树都是二叉搜索树

1.1 二叉搜索树操作的常用操作

Position Find(ElementType X, BinTree BST); // 从二叉搜索树种查找元素X 并返回所在节点的地址
Position FindMin( BinTree BST ); // 从二叉搜索树中查找并返回最小元素
Position FindMax( BinTree BST ); // 最大元素查找
BinTree Insert( ElementType X, BinTree BST ); // 插入
BinTree Delete( ElementType X, BinTree BST ); // 删除

最大元素一定是在树的最优分支的端节点上
最小元素一定是在树的最左分支的端节点上

1.1.1 Find

--> 查找从根节点开始,如果树空,返回NULL
--> 若非空,则根节点关键字和X进行比较,并进行不同处理
[1] 若X小于根节点键值,只需要在左子树继续搜索
[2] 若X大于根节点键值,在右子树继续查找
[3] 若两者比较结果是相等,返回指向此节点的指针

Position Find( ElementType X, BinTree BST )
{
	if( !BST ) return NULL;
	if( X > BST->Data )
		return Find( X, BST->Right );  // 尾递归
	else if ( X < BST->Data )
		return Find( X, BST->Left );   // 尾递归
	else
		return BST;
}

由于非递归函数的执行效率高,可将尾递归函数改为迭代函数

Position IterFind( ElementType X, BinTree BST )
{
	while( BST ){
		if( X > BST->Data )
			BST = BST->Right;
		else if( X < BST->Data )
			BST = BST->Left;
		else
			return BST;
	}
	return NULL;
}

查找的效率决定于树的高度

1.1.2 FindMin 递归法

Position FindMin( BinTree BST )
{
	if( !BST ) return NULL; /*树空*/
	else if( !BST->Left )
		return BST; /*找到最左叶节点*/
	else
		return FindMin( BST->Left ); /*沿左分支继续查找*/
}

1.1.3 FindMax 迭代法

Position FindMax( BinTree BST )
{
	if( BST )
		while( BST->Right )
			BST = BST->Right; /*沿右分支找到最右端*/
	return BST;
}

1.1.4 Insert

关键是要找到元素应该插入的位置,可以采用与Fin类似的方法

BinTree Insert( ElementType X, BinTree BST )
{
	if( !BST ){
		/*若原树为空,则生成并返回一个节点的二叉搜索树*/
		BST = malloc( sizeof( struct TreeNode ) );
		BST->Data = X;
		BST->Left = BST->Right = NULL;
	}else{ /*开始找要插入元素的位置*/
		if( X < BST->Data )
			BST->Left = Insert( X, BST->Left ); /*递归插入左子树*/
		else if( X > BST->Data )
			BST->Right = Insert( X, BST->Right );/*递归插入右子树*/
		/*else X已经存在,什么都不做*/
	return BST;
	}
}

1.1.5 Delete

考虑三种情况
[1] 删除的是叶子节点:直接删除,并修改其父节点指针为NULL
[2] 删除的节点只有一个孩子节点:将其父节点的指针指向要删除节点的孩子节点
[3] 删除的节点有左右子树:用另一节点替代被删除节点: 有子树的最小元素或者左子树的最大元素

BinTree Delete( ElementType X, BinTree BST )
{
	Position Tmp;
	if( !BST ) return BST; /*树空*/
	else if( X < BST->Data )
		BST->Left = Delete( X, BST->Left ); /*左子树递归删除*/
	else if( X > BST->Data )
		BST->Right = Delete( X, BST->Right ); /*右子树递归删除*/
	else{
		if( BST->Left && BST->Right ){/*被删除节点有左右子树*/
			Tmp = FindMin( BST->Right );/*在右子树找最小元素填充节点*/
			BST->Data = Tmp->Data;
			/*在删除节点的右子树中删除最小元素*/
			BST->Right = Delete( BST->Data, BST->Right );
		}else{/*被删除节点有一个或无子节点*/
			Tmp = BST;
			if( !BST->Left ) /*有右子树或无子树*/
				BST = BST->Right;
			else if( !BST->Right ) /*有左子树或无子树*/
				BST = BST->Left;
			free( Tmp );
		}
	}
	return BST;
}

二、平衡二叉树

平衡因子(Balance Factor, BF): BF(T) = hL - hR    hL,hR分别为T的左右子树高度。
平衡二叉树:
空树,或者,任一节点左、右子树高度差的绝对值不超过1,即|BF(T) <= 1|
给定节点数为n的AVL树的最大高度为 O(log2n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值