自用,review01,二叉树
#include<iostream>
#include<string>
#include<cmath>
#include<queue>
using namespace std;
int sumlea=0;
template <class DataType>
struct BiNode
{
DataType data;
BiNode<DataType> *lchild,*rchild;
};
template <class DataType>
class BiTree
{
public:
BiTree(){root=creat(root);}
~BiTree(){release(root);}
void preorder(){preorder(root);}
void inorder(){inorder(root);}
void lastorder(){lastorder(root);}
void levelorder(){levelorder(root);}
void leafcount(){leafcount(root);}
void height(){cout<<height(root)<<endl;}
private:
BiNode<DataType> *root;
BiNode<DataType> *creat(BiNode<DataType> *bt);
void release(BiNode<DataType> *bt);
void preorder(BiNode<DataType> *bt);
void inorder(BiNode<DataType> *bt);
void lastorder(BiNode<DataType> *bt);
int height(BiNode<DataType> *bt);
void leafcount(BiNode<DataType> *bt);
void levelorder(BiNode<DataType> *bt);
};
template <class DataType>
BiNode<DataType> *BiTree<DataType>::creat(BiNode<DataType> *bt)
{
char ch;
cin>>ch;
if(ch=='#')
bt=NULL;
else
{
bt=new BiNode<DataType>;
bt->data=ch;
bt->lchild=creat(bt->lchild);
bt->rchild=creat(bt->rchild);
}
return bt;
}
template <class DataType>
void BiTree<DataType>::release(BiNode<DataType> *bt)
{
if(bt!=NULL)
{
release(bt->lchild);
release(bt->rchild);
delete bt;
}
}
template <class dataType>
void BiTree<dataType>::preorder(BiNode<DataType> *bt)
{
if(bt==NULL)
return;
else
{
cout<<bt->data;
preorder(bt->lchild);
preorder(bt->rchild);
}
cout<<endl;
}
template <class DataType>
void BiTree<DataType>::inorder(BiNode<DataType> *bt)
{
if(bt==NULL)
return;
else
{
inorder(bt->lchild);
cout<<bt->data;
inorder(bt->rchild);
}
cout<<endl;
}
template <class DataType>
void BiTree<DataType>::lastorder(BiNode<DataType> *bt)
{
if(bt==NULL)
return;
else
{
lastorder(bt->lchild);
lastorder(bt->rchild);
cout<<bt->data;
}
cout<<endl;
}
template <class DataType>
void BiTree<DataType>::leafcount(BiNode<DataType> *bt)
{
if(bt==NULL)
return;
else
{
{
if(bt->lchild==NULL&&bt->rchild==NULL)
sumlea++;
else
leafcount(bt->lchild);
leafcount(bt->rchild);
}
}
}
template <class DataType>
int BiTree<DataType>::height(BiNode<DataType> *bt)
{
int lheight=0,rheight=0;
if(bt==NULL)
return 0;
lheight=height(bt->lchild);
rheight=height(bt->rchild);
return (lheight>rheight)?(lheight+1):(rheight+1);
}
template <class DataType>
void BiTree<DataType>::levelorder(BiNode<DataType> *bt)
{//连递归都不用真是可以
queue<BiNode<DataType> *> q;
if(bt)
q.push(bt);
while(!q.empty())
{
bt=q.front();
q.pop();
cout<<bt->data<<endl;
if(bt->lchild)
{
q.push(bt->lchild);
}
if(bt->rchild)
{
q.push(bt->rchild);
}
}
}
int main()
{
BiTree<char> b;
b.preorder();
b.height();
b.leafcount();
cout<<sumlea;
sumlea=0;
return 0;
}