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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM