#include<iostream>
using namespace std;
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//初始化
void InitBiTree(BiTree &T){
T=NULL;
}
//创建
void CreateBiTree(BiTree &T){
char data;
cin>>data;
if(data!='#'){
T=new BiTNode;
T->data=data;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
else T=NULL;
}
//复制二叉树
int Copy(BiTree T,BiTree &NewT){
if(T==NULL) {NewT=NULL; return 0;} //空树
else{
NewT=new BiTNode; //申请新的结点空点
NewT->data=T->data; //复制根结点
Copy(T->lchild,NewT->lchild); //递归复制左孩子
Copy(T->rchild,NewT->rchild); //递归复制右孩子
return 1;
}
}
//计算二叉树的深度
int Depth(BiTree T){
int m,n;
if(T==NULL) return 0; //空树,深度为0
else{
m=Depth(T->lchild); //计算左孩子深度
n=Depth(T->rchild); //计算右孩子深度
if(m>n) return(m+1); //深度为二者较大值+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 LeafCount(BiTree T){
if(T==NULL) return 0; //空树,叶子结点数为0
if(T->lchild==NULL&&T->rchild==NULL) return 1; //是叶子结点,返回1
else return LeafCount(T->lchild)+LeafCount(T->rchild); //否则,返回左叶子+右叶子
}
int main(){
BiTree T;
InitBiTree(T);
cout<<"请输入结点元素:";
CreateBiTree(T);
BiTree NewT;
Copy(T,NewT); //复制
cout<<endl<<"深度:"<<Depth(NewT);
cout<<endl<<"结点总数:"<<NodeCount(NewT);
cout<<endl<<"叶子结点数:"<<LeafCount(NewT);
return 1;
}
运行结果: