1. 程式人生 > >樹和二叉樹2——輸出廣義表形式(帶括號)二叉樹

樹和二叉樹2——輸出廣義表形式(帶括號)二叉樹

二叉樹的基本運算如下(顯示的結果):
(1)建立二叉樹
(2)輸出二叉樹:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)) (3)H 結點:左孩子為 J 右孩子為 K
(4)二叉樹 bt 的高度:7
(5)釋放二叉樹 bt

如何輸出帶括號二叉樹?
這裡用的是根結點和其他結點遞迴函式分離的方式完成的,
即在pre_order_traveral_brackets()中執行遍歷根結點及其左右孩子,然後在pre_order_traveral_brackets1()遍歷其他子結點

完整程式碼如下

#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("釋放二叉樹成功"); }