c语言之二叉树学习

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
typedef char DataType;

//前序输入的测试数据 data ABC***DE*G**F**
//定义二叉树结构体类型
typedef struct btree
{
DataType data;
struct btree *lchild,*rchild;
}BTree,*PTree;


/*层次化初始二叉树 比较牛,PS:层次化输出参考图的广度优先遍历算法*/
void levelCreateBTree(PTree *t,char *v,int i,int l)
{
if(i>l)*t=NULL;
else{
*t = (PTree)malloc(sizeof(BTree));
(*t)->data=v[i];
levelCreateBTree(&(*t)->lchild,v,i*2+1,l);
levelCreateBTree(&(*t)->rchild,v,i*2+2,l);
}
}

//二叉树前序输入初始化
void preCreateBTree(PTree *t)
{
char c;
c=getchar();
if(c=='*')
{
*t=NULL;return;
}
*t=(PTree)malloc(sizeof(BTree));
(*t)->data=c;
preCreateBTree(&((*t)->lchild));
preCreateBTree(&((*t)->rchild));
}

//二叉树前序后序输入初始化 // 测试数据 abdg cefh dgba echf
//pre 前序输入字符串 pres 前序起始长度 pree 前序终止长度 in 中序输入字符串 ins 中序起始长度 ine 中序终止长度


void preInCreateBTree1(PTree *t,char *pre,int pres,int pree,char *in,int ins,int ine)
{
int i;
if(pres>pree||ins>ine)
{
*t=NULL;
}else
{
*t=(PTree)malloc(sizeof(BTree));
(*t)->data=pre[pres];
for(i=ins;i<=ine;i++)
{
if(in[i]==pre[pres])
{
preInCreateBTree1(&(*t)->lchild,pre,pres+1,pres+i-ins,in,ins,i-1);
preInCreateBTree1(&(*t)->rchild,pre,pres+i-ins+1,pree,in,i+1,ine);
break;
}
}
}
}
//二叉排序树初始化
void insertBST(PTree *t,int c)
{
PTree f,p;
p=(*t);
//判定输入值存在的同时,找到数据插入的位置
while(p!=NULL)
{
printf("p->data=%d\n",p->data);
printf("c=%d\n",c);
if(p->data==c)
{
printf("输入的值已经存在!\n");return;
}
f=p;
//递归到最后p是一空值 f为其父节点
p=(c<p->data)?p->lchild:p->rchild;
}
p=(PTree)malloc(sizeof(BTree));
p->data=c;
p->lchild=NULL;p->rchild=NULL;//比较关键
if(*t==NULL)
{
*t=p;
}else
{
if(c<f->data)
{
f->lchild=p;
}else
{
f->rchild=p;
}
}
}
void createBST(PTree *t)
{
int d;
scanf("%d",&d);
if(d==-9999)return;
do{
insertBST(t,d);
scanf("%d",&d);
}while(d!=-9999);

}
/*二叉排序树*/
void BST(PTree *t)
{
int c;
PTree f,p;
scanf("%d",&c);
if(c==-9999)return;//判定输入
do
{
//判定输入值存在的同时,找到数据插入的位置
p=(*t);//归位
while(p!=NULL)
{
if(p->data==c)
{
printf("输入的值已经存在!\n");return;
}
f=p;
//递归到最后p是一空值 f为其父节点
p=(c<p->data)?p->lchild:p->rchild;
}
p=(PTree)malloc(sizeof(BTree));
p->data=c;
p->lchild=NULL;p->rchild=NULL;

if(*t==NULL)
{
*t=p;
}else
{
if(c<f->data)
{
f->lchild=p;
}else
{
f->rchild=p;
}
}
scanf("%d",&c);
}while(c!=-9999);
}

//二叉树前序遍历
void preOrder(PTree t)
{
if(t==NULL)return;
printf("%c",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
//二叉树中序遍历
void inOrder(PTree t)
{
if(t==NULL)return;
inOrder(t->lchild);
printf("%c",t->data);
inOrder(t->rchild);
}
//二叉树后序遍历
void postOrder(PTree t)
{
if(t==NULL)return;
postOrder(t->lchild);
postOrder(t->rchild);
printf("%c",t->data);
}
//求叶子节点数
int leafNum(PTree t)
{
int l,r;
if(!t)return 0;
else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子
else
{
l=leafNum(t->lchild);
r=leafNum(t->rchild);
return l+r;
}
}

//求二叉树中叶子结点的个数
int nodeNum(PTree t)
{
int l,r;
if(t==NULL)return 0;//空树没有叶子节点
else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子(只有一个根结点)
else
{
l=nodeNum(t->lchild);
r=nodeNum(t->rchild);
return l+r+1;
}
}
//求二叉树中度为2的结点数
int node2Num(PTree t)
{

if(t==NULL)return 0;
else
{
if(t->lchild&&t->rchild)return 1+node2Num(t->lchild)+node2Num(t->rchild);
else
{
if(t->lchild&&!t->rchild)return node2Num(t->lchild);
else return node2Num(t->rchild);
}
}
}


//度为1的结点数
int node1Num(PTree t)
{
if(t==NULL)return 0;
if((t->lchild!=NULL&&t->rchild==NULL)||(t->lchild==NULL&&t->rchild!=NULL))return 1;//判定度为1结点
return node1Num(t->lchild)+node1Num(t->rchild);
}
//求高度(深度)根节点深度为1
int height(PTree t)
{
int l,r;
if(t==NULL)return 0;
else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子
else
{
l=height(t->lchild);
r=height(t->rchild);
return (l>r?l:r)+1;
}
}
//交换二叉树的左右子树

void exchangeBtree(PTree t)
{
PTree temp;
if(t)
{
temp=t->lchild;
t->lchild=t->rchild;
t->rchild=temp;

exchangeBtree(t->lchild);
exchangeBtree(t->rchild);
}
}


void main()
{

PTree p=NULL;
int i,l;
char a[100],b[100];
// 前序中序输入测试
printf("前序输入:\n");
gets(a);
l=strlen(a);
levelCreateBTree(&p,a,0,l-1);
// printf("中序输入:\n");
// gets(b);
// preInCreateBTree1(&p,a,0,strlen(a)-1,b,0,strlen(b)-1);*/
// preCreateBTree(&p);
// createBST(&p);
// BST(&p);
printf("层次输出:\n");
levelOutputBtree(p,0);
/* printf("前序输出:\n");
preOrder(p);
printf("\n");
printf("中序输出:");
inOrder(p);
printf("\n");
printf("后续输出:");
postOrder(p);
printf("\n");
printf("树的高度为:%d\n",height(p));
printf("节点数为:%d\n",nodeNum(p));
printf("度为1结点数:%d\n",node1Num(p));
printf("度为2结点数:%d\n",node2Num(p));
printf("叶子节点数为:%d\n",leafNum(p));
exchangeBtree(p);
printf("交换后后续输出:");
postOrder(p);
*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值