C++实现 排序树

#include<iostream>
using namespace std;
template<typename T1>
class sortTree;
//根的类型
template<typename T>
class node
{
public:
	//有参构造
	node(T);
	//友元类
	friend class sortTree<T>;
protected:
	T data;    //数据域
	node* lchild;//左孩子
	node* rchild;//右孩子
};
//有参构造
template<typename T>
node<T>::node(T k):data(k),lchild(NULL),rchild(NULL)
{
}


template<typename T1>
class sortTree
{
public:
	sortTree();
	sortTree(T1*,int);
	//定义接口:查找指定插入位置
	bool SearchTN(node<T1>* ploc,node<T1>** pos,int key,node<T1>*);
	//插入节点
	bool InsertTN(int key,node<T1>* ploc);
	//中序
	void inOrder(node<T1>* ploc);
	//接口
	node<T1>* getRoot();
protected:
	//根节点
	node<T1>* root;	
};
//构造函数
template<typename T1>
sortTree<T1>::sortTree(T1* data,int ilen):root(NULL)
{
	int i=0;
	while(i<ilen)
	{
		//cout<<*(data+i)<<endl;
		this->InsertTN(*(data+i),this->root);//构造成排序树
		i++;
	}	
}
template<typename T1>
//无参构造
sortTree<T1>::sortTree():root(NULL)
{
}
//查找节点
template<typename T1>
bool sortTree<T1>::SearchTN(node<T1>* ploc,node<T1>** pos,int key,node<T1>* fn)
{
	if(NULL==ploc)	//查找失败
	{
		*pos=fn;//记录父节点地址
		return false;
	}
	else if(key==ploc->data)//
	{
		*pos=ploc;//记录查找成功的地址
		return true;
	}
	else if(key > ploc->data)//右边
		return SearchTN(ploc->rchild,pos,key,ploc);
	else
		return SearchTN(ploc->lchild,pos,key,ploc);
}
//插入节点
template<typename T1>
bool sortTree<T1>::InsertTN(int key,node<T1>* ploc)
{
//1分配空间
	node<T1>* pnew=new node<T1>(key);
	if(NULL==pnew)
		return false;
//2修改指向域---查找节点位置
	node<T1>* pos=NULL;
	if(false==this->SearchTN(this->root,&pos,key,NULL))
	{
		if(NULL==pos)//说明Pnew成为根节点
			this->root=pnew;
		else
		{
			if(key<pos->data)//成为左孩子
			{
				pos->lchild=pnew;
			}
			else		//成为右孩子
				pos->rchild=pnew;
		}
		return true;
	}
}
template<typename T1>
void sortTree<T1>::inOrder(node<T1>* ploc)
{
	if(NULL==ploc)
		return ;
	//左子树
	inOrder(ploc->lchild);
	cout<<ploc->data<<" ";
	//右子树
	inOrder(ploc->rchild);
	
}
template<typename T1>
node<T1>* sortTree<T1>:: getRoot()
{	
	return this->root;
}

int main()
{
//实例化:
	int b[]={10,1,0,8,3,5,4,6,7,12,11,30,28,27,26};
	sortTree<int> s(b,15);//有参构造
	s.inOrder(s.getRoot());


}

 

点赞