樹和二叉樹2——輸出廣義表形式(帶括號)二叉樹
阿新 • • 發佈:2018-12-09
二叉樹的基本運算如下(顯示的結果):
(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("釋放二叉樹成功");
}