当前位置:文档之家› c语言实现二叉树的代码

c语言实现二叉树的代码

1,2两问的程序代码如下:#include "stdio.h"#include"malloc.h"typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree Create(BiTree T){char ch;ch=getchar();if(ch=='#')T=NULL;else{T=(BiTNode *)malloc(sizeof(BiTNode)); T->data=ch;T->lchild=Create(T->lchild);T->rchild=Create(T->rchild);}return T;}int node(BiTree T){int sum1=0,a,b;if(T){if(T!=NULL)sum1++;a=node(T->lchild);sum1+=a;b=node(T->rchild);sum1+=b;}return sum1;}int mnode(BiTree T){int sum2=0,e,f;if(T){if((T->lchild!=NULL)&&(T->rchild!=NULL)) sum2++;e=mnode(T->lchild);sum2+=e;f=mnode(T->rchild);sum2+=f;}return sum2;void Preorder(BiTree T){if(T){printf("%c",T->data); Preorder(T->lchild); Preorder(T->rchild);}}int Sumleaf(BiTree T){int sum=0,m,n;if(T){if((!T->lchild)&&(!T->rchild)) sum++;m=Sumleaf(T->lchild);sum+=m;n=Sumleaf(T->rchild);sum+=n;}return sum;}void zhongxu(BiTree T){{zhongxu(T->lchild);printf("%c",T->data);zhongxu(T->rchild);}}void houxu(BiTree T) {if(T){houxu(T->lchild);houxu(T->rchild);printf("%c",T->data);}}main(){BiTree T;int sum,sum1,sum3; printf("请输入字符串:\n");T=Create(T);printf("前序遍历:\n");Preorder(T);printf("\n");printf("中序遍历:\n");zhongxu(T); printf("\n");printf("后序遍历:\n");houxu(T);printf("\n");sum=Sumleaf(T); printf("树叶数为:\n");printf("%d",sum); printf("\n");printf("树结点数为:\n");sum1=node(T); printf("\n");printf("%d",sum1); printf("\n");printf("树满结点数为:\n");sum3=mnode(T); printf("%d",sum3); printf("\n");}3,4两问的程序代码如下:#include<stdio.h> J K#include <malloc.h>#define NULL 0#define MAX 100/*定义二叉树*/typedef struct bitnode{ char data;struct bitnode *lchild,*rchild;}bitnode;/*定义栈元素的类型*/typedef struct node{ struct bitnode *p;}node;/*定义栈*/typedef struct stack{ node *base;node *top;int size;}stack;/*全局变量*/struct bitnode *T;stack *s;int i=0,a; /*a为二叉树的结点总数;i为访问结点时的计数*//*构建空栈*/stack *initstack(){s->base=(struct node *)malloc(MAX*sizeof(node));if(!s->base) exit(0);s->top=s->base;s->size=MAX;return s;}/*判断栈是否为空栈*/int stackempty(stack *s){ if(s->top==s->base) return 1;else return 0;}/*入栈*/stack *push(stack *s,struct bitnode *t){ if(s->top-s->base==s->size){s->base=(struct node *)realloc(s->base,(s->size+10)*sizeof(node));if(!s->base) exit(0);s->top=s->base+s->size;s->size+=10;}(*s->top).p=t;s->top++;return s;}/*出栈*/struct bitnode *pop(stack *s){if(s->top==s->base){ printf("这是一个空栈\n");return 0;}else{s->top--;return ((*s->top).p);}}/*取栈顶的元素*/struct bitnode *getpop(stack *s){if(s->top==s->base){printf("这是一个的空栈!\n");return NULL;}elsereturn (*(s->top-1)).p;}/*先序递归构建二叉树*/struct bitnode *creatbitree(struct bitnode *r){char a;scanf("%c",&a);if(a==' ') return r=NULL;else{ r=(struct bitnode*)malloc(sizeof(bitnode));r->data=a;r->lchild=creatbitree(r->lchild);r->rchild=creatbitree(r->rchild);}return r;}/*访问元素*/void visit(char ch){ if(i!=(a-1)){ printf("%c->",ch);i++;}else{ printf("%c",ch);printf("\n");}}/*中序非递归遍历二叉树*/void inorder(struct bitnode *T){ struct bitnode *p,*q;p=T;s=initstack();if(p){ while(p){ push(s,p);p=p->lchild;}while(!stackempty(s)){ p=pop(s);visit(p->data);if(p->rchild!=NULL){ q=p->rchild;while(q){ push(s,q);q=q->lchild;}}}}}/*求二叉树的结点总数*/int counter(struct bitnode *T){ int num1,num2,num;if(T==NULL) return 0;else{ num1=counter(T->lchild);num2=counter(T->rchild);num=num1+num2+1;return num;}}/*求二叉树的单分支的结点数*/int onecount(struct bitnode *T){ int s1,s2;if(T==NULL) return(0);else{ s1=onecount(T->lchild);s2=onecount(T->rchild);if((T->lchild!=NULL&&T->rchild==NULL)||(T->rchild!=NULL&&T->lchild==NULL)) return (s1+s2+1);else return (s1+s2);}}/*主函数*/main(){ int sum;printf("xian xu shu ru bitree:\n");T=creatbitree(T); /*创建二叉树*/a=counter(T); /*求结点总数*/printf("\na=%d\n",a);printf("\nzhong xu bian li bitree:\n");inorder(T); /*中序遍历二叉树*/sum=onecount(T); /*求单分支的结点数*/printf("\n\nthe bitree dan fen zhi jie dian shu:\nSUM=%d\n",sum);getch();}。

相关主题