#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); */ }