c++实现AVLTree--非递归插入

#include <queue>
#include <stack>
#include <iostream>
namespace _AVL_TREE
{
	
	template <typename T>
	class AVT;
	template <typename T>
	class AVTNode
	{
		friend class AVT<T>;
	public:
		AVTNode(){}
		AVTNode(const T &v, AVTNode<T> *l = 0, AVTNode<T> *r = 0,AVTNode<T> *p=0) 
			:val(v), left(l), right(r),parent(p)
		{
			avl = 0;
			hight = 0;
		}
	private:
		T val;
		AVTNode<T> *left, *right;
		AVTNode<T> *parent;
		int avl, hight;
	};
	template <typename T>
	class AVT
	{
	private:
		AVTNode<T> *root;
		void clear();
		static void visit(AVTNode<T> *);
		static void del(AVTNode<T> *);
		AVTNode<T> *LLRotation(AVTNode<T> *);
		AVTNode<T> *RRRotation(AVTNode<T> *);
		AVTNode<T> *LRRotation(AVTNode<T> *);
		AVTNode<T> *RLRotation(AVTNode<T> *);
		int max(int x, int y)
		{
			return x > y ? x : y;
		}
		void modavl(AVTNode<T> *);
		//void modNode(AVTNode<T> *node);
		//void height(AVTNode<T> *node);
	public:
		AVT()
		{
			root = 0;
		}
		~AVT()
		{
			clear();
		}
		void insert(const T &);
		void breadthFirst(void(*func)(AVTNode<T> *) = &AVT<T>::vist);
		AVTNode<T> * search(const T &e) const;
		//void deletenode(const T &);
	};
	template <typename T>
	AVTNode<T> * AVT<T>::LLRotation(AVTNode<T> *root)
	{
		//旋转
		AVTNode<T> *leftc = root->left;
		root->left = leftc->right;
		//更新父指针的值	
		if (leftc->right)
			leftc->right->parent = root;
		leftc->right = root;
		leftc->parent = root->parent;
		root->parent = leftc;
		//更新avl值
		//modNode(root);
		//modNode(leftc);
		return leftc;
	}
	template <typename T>
	AVTNode<T> *AVT<T>::RRRotation(AVTNode<T> *root)
	{
		AVTNode<T> *rightc = root->right;
		root->right = rightc->left;
		if (rightc->left)
			rightc->left->parent = root;
		rightc->left = root;
		rightc->parent = root->parent;
		root->parent = rightc;
		//modeNode(root);
		//modeNode(rightc);
		return rightc;
	}
	
	template <typename T>
	AVTNode<T> *AVT<T>::LRRotation(AVTNode<T> *root)
	{
		root->left = RRRotation(root->left);
		return LLRotation(root);
	}
	template <typename T>
	AVTNode<T> *AVT<T>::RLRotation(AVTNode<T> *root)
	{
		root->right = LLRotation(root->right);
		return RRRotation(root);
	}
	template <typename T>
	void AVT<T>::modavl(AVTNode<T> *p)
	{
		AVTNode<T> *c;
		if (p->avl == 2)
		{
			c = p->right;
			if (c->avl == 1)
			{
				//更新avl值 +2 +1->0 0
				c->avl = 0;
				p->avl = 0;
				//RR型
				if (p == root)
				{
					root = RRRotation(p);
					return;
				}
				c = p;
				p = p->parent;
				if (c == p->right)
					p->right = RRRotation(c);
				else
					p->left = RRRotation(c);
			}
			else if (c->avl == -1)
			{
				//更新avl值:
				//+2 -1 +1 -> -1 0 0
				if (c->left->avl == 1)
				{
					c->left->avl = 0;
					c->avl = 0;
					p->avl = -1;
				}
				//+2 -1 -1 -> 0 1 0
				else if (c->left->avl == -1)
				{
					c->left->avl = 0;
					c->avl = 1;
					p->avl = 0;
				}
				else
				{
					c->left->avl = 0;
					c->avl = 0;
					p->avl = 0;
				}
				//RL型
				if (p == root)
				{
					root = RLRotation(p);
					return;
				}
				c = p;
				p = p->parent;
				if (c == p->right)
					p->right = RLRotation(c);
				else
					p->left = RLRotation(c);
			}
		}
		else if (p->avl == -2)
		{
			c = p->left;
			if (c->avl == -1)
			{
				//更新avl
				//-2 -1 -> 0 0
				c->avl = 0;
				p->avl = 0;
				//LL型
				if (p == root)
				{
					root = LLRotation(p);
					return;
				}
				c = p;
				p = p->parent;
				if (c == p->right)
					p->right = LLRotation(c);
				else
					p->left = LLRotation(c);
			}
			else if (c->avl == 1)
			{
				//更新avl
				//-2 +1 +1 -> 0 -1 0
				if (c->right->avl == 1)
				{
					c->right->avl = 0;
					c->avl = -1;
					p->avl = 0;
				}
				//-2 +1 -1 ->-1 0 0
				else if (c->right->avl == -1)
				{
					c->right->avl = 0;
					c->avl = 0;
					p->avl = -1;
				}
				else
				{
					c->right->avl = 0;
					c->avl = 0;
					p->avl = 0;
				}
				//LR型
				if (p == root)
				{
					root = LRRotation(p);
					return;
				}
				c = p;
				p = p->parent;
				if (c == p->right)
					p->right = LRRotation(c);
				else
					p->left = LRRotation(c);
			}
		}
	}
	template <typename T>
	void AVT<T>::insert(const T &v)
	{
		if (root == 0)
		{
			root = new AVTNode<T>(v);
			return;
		}
		AVTNode<T> *p = root, *c = root;
		while (c)
		{
			if (v == c->val)
				return;
			else if (v < c->val)
			{
				p = c;
				c = c->left;
			}
			else
			{
				p = c;
				c = c->right;
			}
		}
		if (v>p->val)
		{
			p->right = new AVTNode<T>(v);
			p->right->parent = p;
			p->avl++;
		}
		else
		{
			p->left = new AVTNode<T>(v);
			p->left->parent = p;
			p->avl--;
		}
		while (p != root&&p->avl != 2 && p->avl != -2)
		{
			c = p;
			if (c->avl == 0)
				return;
			p = p->parent;
			if (c == p->left)
				--p->avl;
			else
				++p->avl;
		}
		modavl(p);
	}
	template <typename T>
	inline void AVT<T>::visit(AVTNode<T> *node)
	{
		std::cout << node->val << ' ';
		return;
	}
	template <typename T>
	inline void AVT<T>::del(AVTNode<T> *node)
	{
		delete node;
	}
	template <typename T>
	inline void AVT<T>::clear()
	{
		breadthFirst(del);
		root = 0;
	}
	template <typename T>
	void AVT<T>::breadthFirst(void(*func)(AVTNode<T> *) = &AVT<T>::visit)
	{
		std::queue<AVTNode<T> *> que;
		AVTNode<T> *p = root;
		if (p == 0)
			return;
		que.push(p);
		while (!que.empty())
		{
			p = que.front();
			que.pop();
			if (p->left)
				que.push(p->left);
			if (p->right)
				que.push(p->right);
			func(p);
		}
	}

	template <typename T>
	AVTNode<T> * AVT<T>::search(const T&v)
	{
		AVTNode<T> *p = root;
		while (p)
		{
			if (p->val == v)
			{
				return p;
			}
			if (p->val > v)
			{
				p = p->left;
			}
			else
				p = p->right;
		}
		return p;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值