基本代码如下:
#include <iostream>
using namespace std;
#include <string>
typedef char TElemType;
typedef struct BiTNode{
TElemType data;//结点数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
//先序遍历创建树
void CreateBiTree(BiTree &T){
char ch;
cin>>ch;
if(ch=='#') T=NULL;//遇到空字符,建立空树
else{//递归创建二叉树
T=new BiTNode;//生成根节点
T->data=ch;//根结点数据域置为输入的ch
CreateBiTree(T->lchild);//递归创建左子树
CreateBiTree(T->rchild);//递归创建右子树
}
}
//复制二叉树(复制一颗和T完全相同的二叉树)
void Copy(BiTree T,BiTree &NewT){//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){
if(T==NULL) return 0;//如果是空树,深度为0,递归结束
else{
int m=Depth(T->lchild);//递归计算左子树的深度记为m
int n=Depth(T->rchild);//递归计算右子树的深度记为n
if(m>n) return (m+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(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);//右子树看成一个整体
}
//中序遍历的递归算法
void InOrderTraverse(BiTree T){
if(T){//若二叉树非空
InOrderTraverse(T->lchild);//中序遍历左子树
cout<<T->data; //访问根节点
InOrderTraverse(T->rchild);//中序遍历右子树
}
}
int main(){
BiTree T;
cout<<"请依次输入结点的值:"<<endl;
CreateBiTree(T);
cout<<"中序遍历此二叉树为:";
InOrderTraverse(T); cout<<endl;
cout<<"结点个数为:"<<NodeCount(T)<<"个"<<endl;
cout<<"深度为"<<Depth(T)<<"层"<<endl;
cout<<"叶子结点数"<<LeadCount(T)<<endl;
return 0;
}
实现: