二叉树的基本运算以下(显示的结果):
(1)建立二叉树
(2)输出二叉树:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)) (3)H 结点:左孩子为 J 右孩子为 K
(4)二叉树 bt 的高度:7
(5)释放二叉树 btweb
如何输出带括号二叉树?
这里用的是根结点和其余结点递归函数分离的方式完成的,
即在pre_order_traveral_brackets()中运行遍历根结点及其左右孩子,而后在pre_order_traveral_brackets1()遍历其余子结点svg
完整代码以下函数
#include <stdio.h> #include <stdlib.h> typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; int init(BiTree &t)//存在的意义并不大 { t=NULL; return 1; } int BiTreedestroy(BiTree &t) { if(t) { if(t->lchild) BiTreedestroy(t->lchild); if(t->rchild) BiTreedestroy(t->rchild); free(t); t=NULL; } return 1; } void BiTreecreate(BiTree &t) { char ch; char pch[]="ABD$$EHJ$$KL$$M$N$$$CF$$G$I$$"; static int i=0; ch=pch[i++]; if(ch=='$') t=NULL; else { t=(BiTree)malloc(sizeof(BiTNode)); if(!t) exit(-1); t->data=ch; BiTreecreate(t->lchild); BiTreecreate(t->rchild); } } void pre_order_traveral(BiTree t) { if(t) { printf("%c ",t->data); pre_order_traveral(t->lchild); pre_order_traveral(t->rchild); } } int flag=1; void pre_order_traveral_brackets1(BiTree t) { //A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) if(t) { printf("%c",t->data); if(t->lchild||t->rchild) { printf("(");flag++; } pre_order_traveral_brackets1(t->lchild); if(t->rchild) //if(t->lchild||t->rchild)这个用来判断的是有(A,)的状况 //输出案例没有关于“有左子树没右子树的”显示需求,故不用,但用这条语句会更合理些 printf(","); pre_order_traveral_brackets1(t->rchild); } } void pre_order_traveral_brackets(BiTree t) { //A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) if(t) { printf("%c",t->data); //if(t->lchild||t->rchild) printf("("); pre_order_traveral_brackets1(t->lchild); while(--flag) { printf(")"); } //if(t->lchild) printf(","); pre_order_traveral_brackets1(t->rchild); while(flag--+1) { printf(")"); } } } int max(int a,int b) { return a>b?a:b; } int BiTreedeep(BiTree t) { if(t==NULL) return 0; else { if(t->lchild==NULL&&t->rchild==NULL) return 1; else return 1+max(BiTreedeep(t->lchild),BiTreedeep(t->rchild)); } } int main(){ BiTree binarytree; if(init(binarytree)) printf("建立二叉树成功\n"); BiTreecreate(binarytree); printf("输出二叉树:"); pre_order_traveral_brackets(binarytree); printf("\n二叉树 bt 的高度: %d\n",BiTreedeep(binarytree)); if(BiTreedestroy(binarytree)) printf("释放二叉树成功"); }