⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carrayavltree.h

📁 本人自己的作品
💻 H
📖 第 1 页 / 共 2 页
字号:
#pragma once
#include "ArrayAVLTreeIterator.h"
#define CARRAYAVLTREE_TEMPLATE template<class T> inline
#define CARRAYAVLTREE_TEMPLATE_HEAD template<class T = long>
#define ARRAYSIZE BLOCKDATASIZE
#define CARRAYAVLTREE CArrayAVLTree<T>

CARRAYAVLTREE_TEMPLATE_HEAD
class CArrayAVLTree
{
	friend class ArrayAVLTreeIterator<T>;
protected:
	typedef MyArrayAlloc<T> CArrayAlloc;
	typedef ArrayAVLTreeIterator<T>::CNode CNode;
	typedef ArrayAVLTreeIterator<T>::IteratorStatus IteratorStatus;
	typedef ArrayAVLTreeIterator<T>::IterNode IterNode;
	typedef ArrayAVLTreeIterator<T>::CThisStack CThisStack;
public:
	typedef ArrayAVLTreeIterator<T> iterator;
protected:
	short      _size;//大小
	short      _head;//头
	CArrayAlloc _nodeUsed;//内存使用
	CNode	   _node[ARRAYSIZE];//节点内存
	long       _reserve;//为特殊用处
public:
	CArrayAVLTree(void);
	//复制
	long copy(const CARRAYAVLTREE& tree);
	CArrayAVLTree(const CARRAYAVLTREE& tree);
	CArrayAVLTree& operator =(const CARRAYAVLTREE& tree);
	//清除
	void clear();
	~CArrayAVLTree(void);
protected://存储分配
	short New();
	void Delete(short sb);
public:
	//查找
	iterator find(T& data) const;
	//查找大等于
	iterator find_lower(const T& data) const;
	//查找大于
	iterator find_upper(const T& data) const;
	//查找小等于
	iterator find_front_lower(const T& data) const;
	//查找小于
	iterator find_front_upper(const T& data) const;
protected:
	//查找近似区域
	iterator fina_all(const T& data) const;
public://插入
	bool insert(const T& data);
	long insertrange(T* first,long size);
	//修改已存在数据的非索引的值
	bool modify(const T& data);
	//删除
	bool erase(T& data);
	long eraserange(T& first,T& last);
	long eraserange(T* first,long size);
	//替换
	bool modify(const T& old,const T& now);
public:
	//平衡
	long balance(CARRAYAVLTREE& tree);
	//合并
	long marge(CARRAYAVLTREE& tree);
	//分裂
	long onetotwo(CARRAYAVLTREE& tree);
	//专用于B树的分裂
	T split(CARRAYAVLTREE& tree);
	//专用于B树的合并
	long marge(CARRAYAVLTREE& tree,T mid);
	//专用于B树的平衡
	T balance(CARRAYAVLTREE& tree,T mid);
public://作为B树的未连接
	long reserve() const;
	void reserve(long reserve);
protected:
	// 查找替代者
	short GetDt(CThisStack& node_stack,short node);
protected://平衡(使用旋转)
	void BalanceTree(CThisStack& nodes);
	short LLTurn(short& X);
	short LRTurn(short& X);
	short RRTurn(short& X);
	short RLTurn(short& X);
public:
	//数据数量
	long size() const;
	//高度
	long height() const;
	//平衡因子
	long balance() const;
	//块大小
	static long maxsize();
public:
	iterator begin() const;
	iterator last() const;
	iterator end() const;
	iterator bof() const;
	void Iterator() const;
};
/////////////////////////////构造与析构///////////////////////////
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::CArrayAVLTree(void)
: _head(ZEROLINK)
, _size(0)
, _reserve(ZEROLINK)
{
}

CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::CArrayAVLTree(const CARRAYAVLTREE& tree)
{
	copy(tree);
}

CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE& CARRAYAVLTREE::operator =(const CARRAYAVLTREE& tree)
{
	copy(tree);
	return *this;
}

CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::copy(const CARRAYAVLTREE& tree)
{
	ATLASSERT(&tree != this);
	_head = tree._head;
	_size = tree._size;
	_reserve = tree._reserve;
	memcpy(&_nodeUsed,&tree._nodeUsed,sizeof(_nodeUsed));
	memcpy(_node,tree._node,sizeof(_node));
	return _size;
}
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::~CArrayAVLTree(void)
{
	//因为要存盘,所在没有工作
	//clear();
}
//清零
CARRAYAVLTREE_TEMPLATE
void CARRAYAVLTREE::clear()
{
	//清除分配器就行了
	_nodeUsed.clear();
	_head = ZEROLINK;
}
/////////////////////////////////////////////////////////////////
////////////////存储分配///////////////////////////
CARRAYAVLTREE_TEMPLATE
short CARRAYAVLTREE::New()
{
	return _nodeUsed.alloc();
}
CARRAYAVLTREE_TEMPLATE
void CARRAYAVLTREE::Delete(short sb)
{
	if(sb > ZEROLINK && sb < ARRAYSIZE)
	{
		_nodeUsed.free(sb);
	}
}
/////////////////////////////////////////////////////////////////
//////////////////////属性/////////////////////
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::size() const
{
	return _size;
}
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::height() const
{
	if(_head > ZEROLINK)
		return _node[_head].Height();
	else 
		return 0;
}
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::balance() const
{
	if(_head > ZEROLINK)
		return _node[_head].balance();
	else 
		return 0;
}
//块大小
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::maxsize()
{
	long si = ARRAYSIZE;
	return ARRAYSIZE;
}
/////////////////////////////////////////////////////////////////
//////////////////查找///////////////////
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::iterator CARRAYAVLTREE::find(T& data) const
{
	iterator iter;
	if(_head == ZEROLINK)
		return iter;
	if(!iter._nodes.New())
		return iter;
	IterNode iternode;
	iter._ptree = this;
	short sb = _head;
	while(sb > ZEROLINK)
	{
		iternode.link = sb;
		if(_node[sb] == data)
		{
			iternode.where = iterator::avl_now;
			iter._bof = iter._eof = false;
			iter._nodes->push(iternode);
			data = _node[sb].Data();
			return iter;
		}
		if(_node[sb] < data)
		{
			sb = _node[sb].Right();
			iternode.where = iterator::avl_right;
		}
		else
		{
			sb = _node[sb].Left();
			iternode.where = iterator::avl_left;
		}
		iter._nodes->push(iternode);
	}
	iter.clear();
	return iter;
}
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::iterator CARRAYAVLTREE::fina_all(const T& data) const
{
	iterator iter;
	if(_head == ZEROLINK)
		return iter;
	if(!iter._nodes.New())
		return iter;
	IterNode iternode;
	iter._ptree = this;
	short sb = _head;
	while(sb > ZEROLINK)
	{
		iternode.link = sb;
		if(_node[sb] == data)
		{
			iter._bof = false;
			iter._eof = false;
			iternode.where = iterator::avl_now;
			iter._nodes->push(iternode);
			break;
		}
		if(_node[sb] < data)
		{
			iter._bof = false;
			sb = _node[sb].Right();
			iternode.where = iterator::avl_right;
		}
		else
		{
			iter._eof = false;
			sb = _node[sb].Left();
			iternode.where = iterator::avl_left;
		}
		iter._nodes->push(iternode);
	}
	iternode = iter._nodes->top();
	iter._nodes->pop();
	iternode.where = iterator::avl_now;
	iter._nodes->push(iternode);
	return iter;
}
//查找大于
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::iterator CARRAYAVLTREE::find_upper(const T& data) const
{
	iterator iter = fina_all(data);
	while(!iter.eof() && !iter.IsNull() && !(data < *iter))
		iter++;
	if(iter.eof())
		iter.clear();
	return iter;
}
//查找大等于
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::iterator CARRAYAVLTREE::find_lower(const T& data) const
{
	iterator iter = fina_all(data);
	while(!iter.eof() && !iter.IsNull() && *iter < data)
		iter++;
	if(iter.eof())
		iter.clear();
	return iter;
}
//查找小于
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::iterator CARRAYAVLTREE::find_front_upper(const T& data) const
{
	iterator iter = fina_all(data);
	while(!iter.bof() && !iter.IsNull() && !(*iter < data))
		iter--;
	if(iter.bof())
		iter.clear();
	return iter;
}
//查找小等于
CARRAYAVLTREE_TEMPLATE
CARRAYAVLTREE::iterator CARRAYAVLTREE::find_front_lower(const T& data) const
{
	iterator iter = fina_all(data);
	while(!iter.bof() && !iter.IsNull() && data < *iter)
		iter--;
	if(iter.bof())
		iter.clear();
	return iter;
}
////////////////////////////////////////////////////////////////
/////////////////////////B-树专用//////////////////////
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::reserve() const
{
	return _reserve;
}
CARRAYAVLTREE_TEMPLATE
void CARRAYAVLTREE::reserve(long reserve)
{
	_reserve = reserve;
}
//专用于B树的分裂--自己留大的,别人给小的
CARRAYAVLTREE_TEMPLATE
T CARRAYAVLTREE::split(CARRAYAVLTREE& tree)
{
	T t = _node[_head].Data();
	short head = _head;
	tree = *this;
	_head = _node[head].Right();
	tree._head = _node[head].Left();
	tree._reserve = t.link;
	tree._nodeUsed.free(head);
	_nodeUsed.free(head);

	iterator iter;
	iter = begin();
	long sz = _size;
	tree._size = _size = 0;
	for(;iter;iter++)
	{
		tree._nodeUsed.free(iter.nowsb());
		_size++;
	}
	iter = tree.begin();
	for(;iter; iter++)
	{
		_nodeUsed.free(iter.nowsb());
		tree._size++;
	}
	return t;
}
//专用于B树的分裂--自己留大的,别人给小的
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::onetotwo(CARRAYAVLTREE& tree)
{
	T head = _node[_head].Data();
	long head = _head;
	memcpy(tree._node,_node,sizeof(_node));
	_head = _node[head].Right();
	tree._head = _node[head].Left();
	tree._reserve = t.link;
	tree._nodeUsed[head] = 0;
	_nodeUsed[head] = 0;

	iterator iter;
	iter = begin();
	long sz = _size;
	tree._size = _size = 0;
	for(;iter;iter++)
	{
		_nodeUsed[iter] = 1;
		tree._nodeUsed[iter] = 0;
		_size++;
	}
	iter = tree.begin();
	for(;iter; iter++)
	{
		tree._nodeUsed[iter] = 1;
		_nodeUsed[iter] = 0;
		tree._size++;
	}
	insert(head);
	return _size;
}
//专用于B树的合并
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::marge(CARRAYAVLTREE& tree,T mid)
{
	if(_node[_head] < mid)
	{
		mid.link = _reserve;
		_reserve = tree._reserve;
	}
	else
	{
		mid.link = tree._reserve;
	}
	insert(mid);
	iterator iter = tree.begin();
	for(;iter; iter++)
	{
		insert(*iter);
	}
	return _size;
}
//专用于B树的合并
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::marge(CARRAYAVLTREE& tree)
{
	if(_node[_head] < t)
	{
		mid.link = _reserve;
		_reserve = tree._reserve;
	}
	else
	{
		mid.link = tree._reserve;
	}
	iterator iter = tree.begin();
	for(;iter; iter++)
	{
		insert(*iter);
	}
	return _size;
}
//专用于B树的平衡
CARRAYAVLTREE_TEMPLATE
T CARRAYAVLTREE::balance(CARRAYAVLTREE& tree,T mid)
{
	//一定保证此小tree大
	if(_node[_head] > tree._node[tree._head])
		return tree.balance(*this,mid);
	
	long ca = abs((_size - tree._size)) / 2;
	iterator iter;
	long i;
	T* era = new T[ca + 1];
	era[0] = mid;
	era[0].link = _reserve;
	T data;
	if(_size > tree._size)
	{
		iter = last();
		for(i = 1;i < ca;i++,iter--)
		{
			era[i] = *iter;
		}
		data = *iter;
		mid  = data;
		_reserve = iter->link;
		erase(data);
		for(i = 0;i < ca;i++)
		{
			erase(era[i]);
			tree.insert(era[i]);
		}
	}
	else
	{
		iter = tree.begin();
		for(i = 1;i < ca;i++,iter++)
		{
			era[i] = *iter;
		}
		data = *iter;
		mid  = data;
		_reserve = iter->link;
		tree.erase(data);
		for(i = 0;i < ca;i++)
		{
			tree.erase(era[i]);
			insert(era[i]);
		}
	}
	//this->iter(true);
	//ATLTRACE("%d\n",t.data);
	//tree.iter(true);
	delete[] era;
	return mid;
}

//专用于B树的平衡
CARRAYAVLTREE_TEMPLATE
long CARRAYAVLTREE::balance(CARRAYAVLTREE& tree)
{
	//一定保证此小tree大
	if(_node[_head] > tree._node[tree._head])
		return tree.balance(*this);
	
	long ca = abs((_size - tree._size)) / 2;
	iterator iter;
	long i;
	T* era = new T[ca];
	if(_size > tree._size)
	{
		iter = last();
		for(i = 0;i < ca;i++,iter--)
		{
			era[i] = *iter;
		}
		for(i = 0;i < ca;i++)
		{
			erase(era[i]);
			tree.insert(era[i]);
		}
	}
	else
	{
		iter = tree.begin();
		for(i = 1;i < ca;i++,iter++)
		{
			era[i] = *iter;
		}
		for(i = 0;i < ca;i++)
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -