VC++2012编程演练数据结构《9》平衡二叉搜索树

介绍如何在VC++2012中进行平衡二叉搜索树的节点删除操作,强调删除后通过找到祖父节点进行单旋转或多旋转来保持树的平衡,直至整棵树恢复平衡状态。文章提供了类的实现、调用方法及运行效果,并附带了代码下载链接。
摘要由CSDN通过智能技术生成
平衡二叉搜索树

  任何结点的左子树和右子树高度最多相差1的二叉搜索树。
  (1)AVL树的插入算法
  a. 插入结点之后仍然是AVL树,则不调整;
  b. 插入结点之后不再满足AVL树条件,则进行调整,根据导致不平衡的原因,分为:
  a) LL型――单旋转调整
  b) LR型――双旋转调整
  c) RL型――双旋转调整
  d) RR型――单旋转调整
  下图是顺序插入单词{cup,cop,copy,hit,hi,his,hia}后得到的AVL树,单词之间按照字典顺序比较:
  (2)AVL树的删除算法
  a. 删除过程如BST结点的删除算法

  b. 删除后调整――从被删除的结点找到祖父结点,然后开始单旋转或多旋转操作,一次旋转结束并不 意味着树已经平衡,因为这可能会导致它的祖先结点发生新的不平衡。所以这样的调整操作要一直进行下去,直到树平衡为止。

类的实现如下

//平衡二叉搜索树类定义与实现
template<class T> class BSTree;
//平衡二叉搜索树的结点类型定义
template<class T> struct TNode
{private:
TNode<T>  *left;//左子树指针
TNode<T> *right;//右子树指针
public:
	int balance;//平衡因子
	T data;//数据域
	friend class BSTree<T>;
	//构造函数
	TNode():left(NULL),right(NULL),balance(0){ }
	TNode(T item,TNode<T> *left1,TNode<T> *right1)
		:balance(0),data(item),left(left1),right(right1){ }
};
template<class T> class BSTree
{private:
int size;
public:
	//构造函数
	BSTree(TNode<T> *&root):size(0){root=NULL;}
	//被ClearBST()所调用的函数
	void DeleteTree(TNode<T> *&root);
	//LL型调整操作
	void LL(TNode<T> **a,TNode<T> **b);
	//RR型调整操作
	void RR(TNode<T> **a,TNode<T> **b);
	//LR型调整操作
	void LR(TNode<T> **a,TNode<T> **b);
	//RL型调整操作
	void RL(TNode<T> **a,TNode<T> **b);
	//释放空间
	void FreeBST(TNode<T> *&root);
	//求平衡二叉搜索树中所有结点数
	int BSTSize();
	//判断平衡二叉搜索树是否为空
	int BSTEmpty(TNode<T> *&root);
	//取根指针
	TNode<T> *GetRoot(TNode<T> *&root);
	//从平衡二叉搜索树中查找元素
	T
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值