代码如下:
#include<iostream>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void PreOrderTraverse(BiTree T)
{//先序
if(T==NULL) return;
else{
cout << T->data; //访问根结点
PreOrderTraverse(T->lchild); //先序遍历左子树
PreOrderTraverse(T->rchild); //先序遍历右子树
}
}
void InOrderTraverse(BiTree T)
{//中序
if(T==NULL) return;
else{
InOrderTraverse(T->lchild); //中序遍历左子树
cout << T->data; //访问根结点
InOrderTraverse(T->rchild); //中序遍历右子树
}
}
void PostOrderTraverse(BiTree T)
{//后序
if(T==NULL) return;
else{
PostOrderTraverse(T->lchild); //后序遍历左子树
PostOrderTraverse(T->rchild); //后序遍历右子树
cout << T->data; //访问根结点
}
}
void CreateBiTree(BiTree &T)
{//先序遍历的顺序建立二叉链表
char ch;
cin >> ch;
if(ch=='#') T=NULL; //递归结束,建空树
else
{
T=new BiTNode; //生成根结点
//或T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch; //根结点数据域置为ch
CreateBiTree(T->lchild); //递归创建左子树
CreateBiTree(T->rchild); //递归创建右子树
}
}
void Copy(BiTree T,BiTree &NewT)
{//复制二叉树
if(T==NULL) //如果是空树,递归结束
{
NewT=NULL;
return;
}
else
{
NewT=new BiTNode;
NewT->data=T->data; //复制根结点
Copy(T->lchild,NewT->lchild); //递归复制左子树
Copy(T->rchild,NewT->rchild); //递归复制右子树
}
}
int Depth(BiTree T)
{//计算二叉树的深度
int m,n;
if(T==NULL) return 0; //空树,深度为0,递归结束
else
{
m=Depth(T->lchild); //递归计算左子树的深度记为m
n=Depth(T->rchild); //递归计算右子树的深度记为n
if(m>n) return (m+1);//二叉树的深度为m与n的较大者加1
else return (n+1);
}
}
int NodeCount(BiTree T)
{//统计二叉树中结点的个数
if(T==NULL) return 0; //空树,则结点个数为0,递归结束
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
//结点个数为左子树的结点个数+右子树的结点个数+1
}
int LeadCount(BiTree T)
{//计算二叉树叶子结点数
if(T==NULL) return 0; //空树返回0
if(T->lchild==NULL && T->rchild==NULL)
return 1; //叶子结点返回1
else
return LeadCount(T->lchild)+LeadCount(T->rchild);
}
int main()
{
BiTree T,newT,t;
int x;
cout <<"二叉树的简单实现:"<<endl;
cout<<"输入每个结点的元素:";
CreateBiTree(T);
cout <<endl;
cout <<"先序遍历:" <<endl;
PreOrderTraverse(T);
cout <<endl<<endl;
cout <<"中序遍历:" <<endl;
InOrderTraverse(T);
cout <<endl<<endl;
cout <<"后序遍历:" <<endl;
PostOrderTraverse(T);
cout <<endl<<endl;
cout <<"复制二叉树:"<<endl;
Copy(T,newT);
cout <<"复制前序遍历:";
PreOrderTraverse(newT);
cout <<endl;
cout <<"复制中序遍历:";
InOrderTraverse(newT);
cout<<endl;
cout <<"复制后序遍历:";
PostOrderTraverse(newT);
cout <<endl<<endl;
cout <<"计算二叉树的深度:"<<endl;
x=Depth(T);
cout <<x<<endl<<endl;
cout <<"二叉树中结点的个数:"<<endl;
x=NodeCount(T);
cout <<x<<endl<<endl;
cout <<"二叉树叶子结点数:"<<endl;
x=LeadCount(T);
cout <<x<<endl;
}
输入时一定要按照先序的顺序输入字符元素