#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());
}