二叉树
输入
先序遍历(先输入根,有左右结点就输入,没有就输入#)
输出
中序遍历输出、先序遍历输出、后序遍历输出、树的深度、结点的个数、叶结点的个数、度为1的结点个数、二叉树中从每个叶子结点到根结点的所有路径:
using namespace std;
typedef char TElemType;
#define MAXSIZE 50
#include <iostream>
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BitNode,*BiTree;
void CreateBiTree(BiTree &T){
TElemType ch;
cin>>ch;
if(ch=='#') T=NULL;
else{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrderTraverse(BiTree T){
if(T){
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
int Depth(BiTree T){
int m,n;
int depthval;
if(!T)
depthval=0;
else{
m=Depth(T->lchild);
n=Depth(T->rchild);
depthval=1+(m>n?m:n);
}
return depthval;
}
int NodeCount(BiTree T){
if(!T)
return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int LeafCount(BiTree T){
if(!T)
return 0;
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
LeafCount(T->lchild)+LeafCount(T->rchild);
}
int NodeNumber_1(BiTree T){
if(!T)
return 0;
if((T->lchild==NULL&&T->rchild!=NULL)||(T->lchild!=NULL&&T->rchild==NULL))
return 1+NodeNumber_1(T->lchild)+NodeNumber_1(T->rchild);
else
return NodeNumber_1(T->lchild)+NodeNumber_1(T->rchild);
}
void Route(BiTree T,char *path,int pathlen){ //输出二叉树中从每个叶子结点到根结点的路径
if(T == NULL){
return;
}
if(T->lchild == NULL && T->rchild == NULL){
cout<<endl<<T->data<<" ";
for(int i = pathlen-1; i >= 0; i--){
cout<<path[i]<<" ";
}
}
else{
path[pathlen++] = T->data;
Route(T->lchild,path,pathlen);
Route(T->rchild,path,pathlen);
}
}
int main()
{
BiTree T;
cout<<"请先序遍历输入(以#结束):";
CreateBiTree(T);
cout<<"中序遍历输出:";
InOrderTraverse(T);
cout<<endl<<"先序遍历输出:";
PreOrderTraverse(T);
cout<<endl<<"后序遍历输出:";
PostOrderTraverse(T);
cout<<endl<<"树的深度:"<<Depth(T);
cout<<endl<<"结点的个数:"<<NodeCount(T);
cout<<endl<<"叶结点的个数:"<<LeafCount(T);
cout<<endl<<"度为1的结点个数:"<<NodeNumber_1(T);
cout<<endl<<"二叉树中从每个叶子结点到根结点的所有路径:"<<endl;
char path[256];
int pathlen=0;
Route(T,path,pathlen);
return 0;
}