C++泛型编程实现平衡二叉搜索树AVL

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++泛型编程实现平衡二叉搜索树AVL相关的知识,希望对你有一定的参考价值。

代码如下:

#include <iostream>
using namespace std;

template <typename T>
struct AVLNode
{

	typedef AVLNode<T>  Node;
	AVLNode(const T &val = T()):_parent(nullptr),_left(nullptr),_right(nullptr),_val(nullptr),_bf(0){}

	Node *_parent;
	Node *_left;
	Node *_right;
	T _val;
	int _bf;
};


template<typename T>
class AVLTreeNode
{
public:
	typedef AVLNode<T> Node;

	Node *LL_Rotate(Node *a)
	{
		Node *b;
		b = a->_left;
		a->_left = b->_right;
		b->_right = a;
		a->_bf = b->_bf = 0;
		return b;
	}

	Node *RR_Rotate(Node *a)
	{
		Node *b;
		b = a->_right;
		a->_right = b->_left;
		b->_left = a;
		a->_bf = b->_bf = 0;
		return b;
	}

	Node *LR_Rotate(Node *a)
	{
		Node *b, *c;
		b = a->_left;
		c = b->_right;
		a->_left = c->_right;
		b->_right = c->_left;
		c->_left = b;
		c->_right = a;
		if (c->_bf == 1) 
		{
			a->_bf = -1;
			b->_bf = 0;
		}
		else if (c->_bf == -1)
		{
			a->_bf = 0;
			b->_bf = 1;
		}
		else
		{
			a->_bf = b->_bf = 0;
		}
		c->_bf = 0;
		return c;
	}

	Node *RL_Rotate(Node *a)
	{
		Node *b, *c;
		b = a->_right;
		c = b->_left;
		a->_right = c->_left;
		b->_left = c->_right;
		c->_left = a;
		c->_right = b;
		if (c->_bf == 1)
		{
			a->_bf = 0;
			b->_bf = -1;
		}
		else if (c->_bf == -1)
		{
			a->_bf = 1;
			b->_bf = 0;
		}
		else
		{
			a->_bf = b->_bf = 0;
		}
		c->_bf = 0;
		return c;
	}


	void AVLInsert(Node *&pavlt, Node *s)
	{
		Node *f, *a, *b, *p, *q;
		if (pavlt == nullptr)//没有根结点,那么插入的结点s就当作根结点
		{
			pavlt = s;
			return;
		}

		a = pavlt;//指针a记录离*s最近的平衡因子不为0的结点,f指向*a的父结点
		f = nullptr;
		p = pavlt;
		q = nullptr;

		while (p != nullptr)
		{
			if (p->_val == s->_val) return;
			if (p->_bf != 0)
			{
				a = p;
				f = q;
			}
			q = p;
			if (s->_val < p->_val) p = p->_left;
			else p = p->_right;
		}

		if (s->_val < q->_val) q->_left = s;
		else q->_right = s;

		p = a;
		while (p != s)
		{
			if (s->_val < p->_val)
			{
				p->_bf++;
				p = p->_left;
			}
			else
			{
				p->_bf--;
				p = p->_right;
			}
		}
		if (a->_bf > -2 && a->_bf < 2) return; //插入结点后,没有破坏树的平衡性
		if (a->_bf == 2)
		{
			b = a->_left;
			if (b->_bf == 1) p = LL_Rotate(a);
			else p = LR_Rotate(a);
		}
		else
		{
			b = a->_right;
			if (b->_bf == 1) p = RL_Rotate(a);
			else p = RR_Rotate(a);
		}
		if (f == nullptr) pavlt = p;//原*a是AVL树的根
		else if (f->_left == a) f->_left = p;
		else f->_right = p;
	}


	void CreateTree()
	{
		int n;
		cin >> n;
		for (int i = 0; i < n; i++)
		{
			Node *s = new Node;
			cin > s->_val;
			AVLInsert(_root, s);
		}
	}

	void InOrderTree()
	{
		InOrder(_root);
		cout << endl;
	}

	

private:
	Node *_root;
	void InOrder(Node *cur)
	{
		if (cur)
		{
			InOrder(cur->_left);
			cout << cur->_val << " ";
			InOrder(cur->_right);
		}
	}
};

以上是关于C++泛型编程实现平衡二叉搜索树AVL的主要内容,如果未能解决你的问题,请参考以下文章

C++进阶第十八篇——AVL树(概念+平衡因子的调节+旋转+代码实现)

C++ 实现平衡二叉树(AVL树)(完整代码)

C++从入门到入土第二十一篇:二叉搜索树之AVL树

C++从入门到入土第二十一篇:二叉搜索树之AVL树

C++从入门到入土第二十一篇:二叉搜索树之AVL树

二叉平衡搜索树AVL 学习解析 及代码实现研究