#include<iostream>
using namespace std;
template<class T>
struct BiNode
{
T data;
BiNode<T> *lchild,*rchild,*parent;
};
template<class T>
class BiTree
{
private:
BiNode<T> *root;
BiNode<T> *creat(BiNode<T> *bt);
void Release(BiNode<T> *bt);
void Preorder(BiNode<T> *bt);
void Inorder(BiNode<T> *bt);
void Postorder(BiNode<T> *bt);
void Print(BiNode<T> *bt);
void Creatparent(BiNode<T> *bt);
void Getleaf(BiNode<T> *bt);
public:
BiTree()
{
root=creat(root);root->parent=NULL;
}
~BiTree(){Release(root);}
void Preorder(){Preorder(root);}
void Inorder(){Inorder(root);}
void Postorder(){Postorder(root);}
void Print(){Print(root);}
void Creatparent(){Creatparent(root);}
void Getleaf(){Getleaf(root);}
};
template<class T>
BiNode<T> *BiTree<T>::creat(BiNode<T> *bt)
{
char ch;
cin>>ch;
if(ch=='0') return NULL;
else
{
bt=new BiNode<T>;
bt->data=ch;
bt->lchild=creat(bt->lchild);
bt->rchild=creat(bt->rchild);
}
return bt;
}
template<class T>
void BiTree<T>::Release(BiNode<T> *bt)
{
if(bt!=NULL)
{
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
template<class T>
void BiTree<T>::Preorder(BiNode<T> *bt)
{
if(bt==NULL) return;
else
{
cout<<bt->data<<" ";
Preorder(bt->lchild);
Preorder(bt->rchild);
}
}
template<class T>
void BiTree<T>::Inorder(BiNode<T> *bt)
{
if(bt==NULL)return;
else{
Inorder(bt->lchild);
cout<<bt->data<<" ";
Inorder(bt->rchild);
}
}
template<class T>
void BiTree<T>::Postorder(BiNode<T> *bt)
{
if(bt==NULL)return;
else
{
Postorder(bt->lchild);
Postorder(bt->rchild);
cout<<bt->data<<" ";
}
}
template<class T>
void BiTree<T>::Print(BiNode<T> *bt)
{
if(bt)
{
if(bt->lchild)
{
cout<<bt->data<<"有左孩子"<<bt->lchild->data<<"\t";
}
else {cout<<bt->data<<"无左孩子"<<"\t";}
if(bt->rchild)
{
cout<<bt->data<<"有右孩子"<<bt->rchild->data<<"\t";}
else {cout<<bt->data<<"无右孩子"<<"\t";}
if(bt->parent==NULL)cout<<"该结点为根结点,无双亲\n";
else cout<<bt->data<<"的双亲为"<<bt->parent->data<<endl;
}
else return;
Print(bt->lchild);
Print(bt->rchild);
}
template<class T>
void BiTree<T>::Creatparent(BiNode<T> *bt)
{
if(bt)
{if(bt->lchild)
{bt->lchild->parent=bt;}
if(bt->rchild)
{bt->rchild->parent=bt;}
}
else return;
Creatparent(bt->lchild);
Creatparent(bt->rchild);
}
template<class T>
void BiTree<T>::Getleaf(BiNode<T> *bt)
{
if(bt)
{
if(bt->lchild==NULL&&bt->rchild==NULL)
cout<<bt->data<<"\t";
Getleaf(bt->lchild);
Getleaf(bt->rchild);
}
}
int main()
{
cout<<"输入结点信息 :"<<endl;
BiTree<char> t;
cout<<"递归前序遍历输出 :"<<endl;
t.Preorder();
cout<<endl;
cout<<"递归中序遍历输出 :"<<endl;
t.Inorder();
cout<<endl;
cout<<"递归后序遍历输出 :"<<endl;
t.Postorder();
cout<<endl;
t.Creatparent();
t.Print();
cout<<"叶子结点为: ";
t.Getleaf();
return 0;
}