//定义节点
typedef struct BiNode
{
char data;//类型根据自己需求定义
struct BiNode *lchild,*rchild;//左右孩子
} BiNode,*BiTree;
//创建二叉树
BiTree CreateBiTree(BiTree t)
{
char c;
c=getchar();
if(c=='#')//自己设置null标志
{
t=NULL;
}
else
{
if(!(t=(BiTree)malloc(sizeof(BiNode))))
{
printf("空间开辟失败");
return ;
}
t->data=c;
t->lchild=CreateBiTree(t->lchild);
t->rchild=CreateBiTree(t->rchild);
//递归调用CreateBiTree方法,当 当前节点的左右孩子都创建完成时,返回到当前节点,左右孩子为null时结束递归
}
return t;
}
//遍历二叉树
void ProOrderTraverse(BiTree t)
{
if(t==NULL)//等于null时为空树,无需遍历
{
return ;
}
else
{
printf("%c",t->data); //(1)
t->lchild=ProOrderTraverse(t->lchild);//(2)
t->rchild=ProOrderTraverse(t->rchild);//(3)
//(1)(2)(3)顺序不同顺序代表不同的遍历
//(1)(2)(3)为先序遍历
//(2)(1)(3)为中序遍历
//(2)(3)(1)为后序遍历
}
}
//计算叶子节点总数
int Treen0(BiTree t)
{
if(t==NULL)
{
return 0;
}
if(t->lchild==NULL&&t->rchild==NULL)
{
return 1;
}
else
return Treen0(t->lchild)+Treen0(t->rchild);
}
/*
度数为零的节点,当只有一个根节点时,此节点也为叶子,可以直接返回1
度数为1或者2的节点,只有根并无意义,不能直接返回1,要递归至最后一层节点来终止递归
*/
//计算度数为1的节点
int Treen1(BiTree t)
{
if(t==NULL)
{
return 0;
}
if(!(t->lchild==NULL&&t->rchild==NULL)&&!(t->lchild!=NULL&&t->rchild!=NULL))
{
return Treen1(t->lchild)+Treen1(t->rchild)+1;
//进入这个if说明当前节点度数为1
}
else
{
return Treen1(t->lchild)+Treen1(t->rchild);
//进入else说明度数不为1,继续递归进入下一层,直至最后一层
}
}
//总度数的节点和度数为2的节点与度数为1的节点原理相同
int Treen2(BiTree t)
{
if(t==NULL)
{
return 0;
}
if(!(t->lchild==NULL&&t->rchild==NULL)&&!(t->lchild!=NULL&&t->rchild!=NULL))
{
return Treen2(t->lchild)+Treen2(t->rchild)+1;
//进入这个if说明当前节点度数为2
}
else
{
return Treen2(t->lchild)+Treen2(t->rchild);
//进入else说明度数不为2,继续递归进入下一层,直至最后一层
}
}
//计算节点总数
int Treen(BiTree t)
{
if(t==NULL)
{
return 0;
}
else
{
return Treen(t->lchild)+Treen(t->rchild)+1;
//从最后一个节点一个一个加回来
//最后的 return 0+0+1;
}
}
/*
如果是空树,深度为0;
否则递归计算左子树的深度为m;
递归计算右子树的深度为n;
二叉树深度为 m>n?m:n 再加1;
到最后一层停止递归
*/
//计算二叉树的深度
int Depth(BiTree t)
{
int m,n;
if(t==NULL)
{
return 0;
}
else
{
m=Depth(t->lchild);
n=Depth(t->rchild);
if(m>n)
return m+1;
else
return n+1;
}
}
/*
如果是空树,结束递归
否则
申请新节点复制根节点
递归复制左子树
递归复制右子树
*/
void CopyTree(BiTree t,BiTree newt)
{
if(t==NULL)
{
newt=NULL;
}
else
{
newt=(BiTree)malloc(sizeof(BiNode));
newt->data=t->data;
CopyTree(t->lchild,newt->lchild);
CopyTree(t->rchild,newt->rchild);
}
}