当前位置:文档之家› C语言二叉树运算

C语言二叉树运算

#include<stdio.h>#include<stdlib.h>typedef struct bitnode{char data;struct bitnode *lchild;struct bitnode *rchild;}bitnode,*bitree;bitree createbitree(bitree &T){char ch;printf("输入结点值ch=");scanf("%c",&ch);scanf("%c",&ch);if(ch!='#'){if(!(T=(bitnode*)malloc(sizeof(bitnode)))) return 0;T->data=ch;T->lchild=NULL;T->rchild=NULL;createbitree(T->lchild);createbitree(T->rchild);}return T;}void preorder(bitree &p){if(p){printf("%c",p->data);if(p->lchild!=NULL)preorder(p->lchild);if(p->rchild!=NULL)preorder(p->rchild);}else printf("NULL");}void inorder(bitree &p){if(p){if(p->lchild!=NULL)inorder(p->lchild);printf("%c",p->data);if(p->rchild!=NULL)inorder(p->rchild);}}void postorder(bitree &p){if(p){if(p->lchild!=NULL)postorder(p->lchild);if(p->rchild!=NULL)postorder(p->rchild);printf("%c",p->data);}}int number(bitree &bt){int n1,n2;if(!bt)return 0;if(!bt->lchild&&!bt->rchild) return 1;n1=number(bt->lchild);n2=number(bt->rchild);return(n1+n2+1);}int leafs(bitree &bt){int n1,n2;if(!bt) return 0;if(!bt->lchild&&!bt->rchild) return 1;n1=leafs(bt->lchild);n2=leafs(bt->rchild);return n1+n2;}int height(bitree &bt){int h1,h2;if(!bt) return 0;h1=height(bt->lchild);h2=height(bt->rchild);return 1+(h1>h2 ? h1:h2);}void copytree(bitree &T,bitree &s){if(!T) s=NULL;else{s=(bitnode*)malloc(sizeof(bitnode));if(T->lchild!=NULL)copytree(T->lchild,s->lchild);else s->lchild=NULL;if(T->rchild!=NULL)copytree(T->rchild,s->rchild);else s->rchild=NULL;s->data=T->data;}}int Calculate(BiTree T)//计算表达式二叉树的值{ //后序遍历实现int nl,nr;if(!T->lchild&&!T->rchild) return T->data;if(!T->lchild->lchild&&!T->lchild->rchild) return T->lchild->data;nl=Calculate(T->lchild);if(!T->rchild->lchild&&!T->rchild->rchild) return T->rchild->data;nr=Calculate(T->rchild);switch(T->data){case '+': return (nl-48)+(nr-48);case '-': return (nl-48)-(nr-48);case '*': return (nl-48)*(nr-48);case '/': return (nl-48)/(nr-48);}}void deletetree(bitree &bt){if(!bt) return;bitnode *p;p=bt;if(p->lchild)deletetree(p->lchild);if(p->rchild)deletetree(p->rchild);free(p);bt=NULL;}bitree exchangetree(bitree &bt){bitnode *t,*t1,*t2;if(!bt) t=NULL;else{t=(bitnode *)malloc(sizeof(bitree));t->data=bt->data;t1=exchangetree(bt->lchild);t2=exchangetree(bt->rchild);t->lchild=t2;t->rchild=t1;}return t;}#define N 10void main(){bitree p[N]={NULL};int i,j,menu;while(1){printf("\n");printf(" 1--creat\n");printf(" 3--preorder\n");printf(" 4--inorder\n");printf(" 5--postorder\n");printf(" 6--copy\n");printf(" 7--number\n");printf(" 8--leafs\n");printf(" 9--height\n");printf(" 10--deleate\n");printf(" 11--qiuzhi\n");printf(" 12--exchange\n");printf("\n please chose:");scanf("%d",&menu);switch(menu){case 0:return;case 1:printf("\n输入新建二叉树下标(0--%d)\n",N-1);scanf("%d",&i);p[i]=createbitree(p[i]);break;case 3:printf("输入要前序遍历的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);preorder(p[i]);break;case 4:printf("输入要中序遍历的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);inorder(p[i]);break;case 5:printf("输入要后序遍历的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);postorder(p[i]);break;case 6:printf("输入要复制的二叉树下标和复制后的二叉树下标(0--%d)\n",N-1);scanf("%d%d",&i,&j);copytree(p[i],p[j]);break;case 7:int x;printf("输入要统计的二叉树节点的下标(0--%d)\n",N-1);scanf("%d",&i);x=number(p[i]);printf("%d",x);break;case 8:int y;printf("输入要统计的二叉树叶子树的下标(0--%d)\n",N-1);scanf("%d",&i);y=leafs(p[i]);printf("%d",y);break;case 9:int z;printf("输入要计算的二叉树高度的下标(0--%d)\n",N-1);scanf("%d",&i);z=height(p[i]);printf("%d",z);break;case 10:printf("输入要删除的二叉树的下标(0--%d)\n",N-1);scanf("%d",&i);deletetree(p[i]);break;case 11:int j;printf("输入要求值的二叉树的下标(0--%d)\n",N-1);scanf("%d",&i);j=Calculate(bt);printf("结果=%d\n",j);break;case 12:printf("输入要交换子树的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);p[i]=exchangetree(p[i]);break;}}}。

相关主题