结点
template <typename T>
struct BiNode
{
T data;
BiNode<T> *lchild,*rchild;
};
树(类)
template <typename T>
class BiTree
{
private:
BiNode<T> *root;
BiNode<T> *Creat();
void PreOrder(BiNode<T> *root);
void InOrder(BiNode<T> *root);
void PostOrder(BiNode<T> *root);
public:
BiTree(){root=Creat();}
void PreOrder(){PreOrder(root);}
void InOrder(){InOrder(root);}
void PostOrder(){PostOrder(root);}
};
构造
template <typename T>
BiTree<T>::Creat()
{
char ch;
cin>>ch;
if(ch=='#')
root=NULL;
else
{
S=new BiNode<T>;
S->data=ch;
root->lchild=Creat();
root->rchild=Creat();
}
}
前序
template <typename T>
void BiTree<T>::PreOrder()
{
if(root==NULL)
return;
cout<<root->data<<" ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
中序
template <typename T>
void BiTree<T>::InOrder()
{
if(root==NULL)
return;
InOrder(root->lchild);
cout<<root->data<<" ";
InOrder(root->rchild);
}
后序
template <typename T>
void BiTree<T>::PostOrder()
{
if(root==NULL)
return;
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data<<" ";
}
结点个数
template <typename T>
int BiTree<T>::Count(BiNode<T>*root)
{
int count=0;
if(root==NULL)
return 0;
count=Count(root->lchild)+Count(root->rchild)+1;
return count;
}
叶子结点
template <typename T>
int BiTree<T>::Leaf(BiNode<T> *root)
{
int count=0;
if(root==NULL)
count=0;
else if(root->lchild==NULL&&root->rchild==NULL)
count=1;
else
count=Leaf(root->lchild)+Leaf(root->rchild);
return count;
}
高度
template <typename T>
int BiTree<T>::height(BiNode<T>*root)
{
int lheight=0;
int rheight=0;
if(root==NULL)
return 0;
lheight=height(root->lchild);
rheight=height(root->rchild);
if(lheight>rheight)
return lheight+1;
else
return rheight+1;
}
交换
template <typename T>
void BiTree<T>::Change(BiNode<T>*root)
{
if(root==NULL)
return;
Change(root->lchild);
Change(root->rchild);
swap(root->lchild,root->rchild);
}