1. 程式人生 > 其它 >二叉樹的建立及其他操作

二叉樹的建立及其他操作

//1、	根據下列程式環境的設定,補充完整二叉樹的二叉連結串列結點結構體的定義。
#include "stdio.h"

#define OK 1
#define ERROR 0
typedef int status; 
//下面是二叉樹相關的定義
#define MAX 20
typedef char Telemtype;                      
typedef struct BTnode                      
{
	Telemtype data;
	struct BTnode *lchild;
	struct BTnode *rchild;    
}BTnode,*Btree;                         

//2、	在第1題的基礎上,補充完整下面的先序建立二叉樹函式。
Btree create(Btree &T)
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#') T=NULL;
	else
	{ 
		T=new BTnode;
	    T->data=ch;
	    create(T->lchild);
	    create(T->rchild);
	}
	return T;
}

//3、	在第1和第2題的基礎上,編寫先序、中序和後序遍歷二叉樹的函式。
/* 先序*/
int pre_display(Btree T)
{ 
	if(T) 
	{  
	  printf("%3c",T->data);
	  pre_display(T->lchild);
	  pre_display(T->rchild);
}
	return OK; 
}
/* 中序*/
int in_display(Btree T)
{ 	
	if(T!=NULL) 
	{  	 
		in_display(T->lchild);
		printf("%3c",T->data);
		in_display(T->rchild);		
	}
return OK;
}
/* 後序*/
int post_display(Btree T)
{ 
	if(T){
		post_display(T->lchild);
		post_display(T->rchild);
		printf("%3c",T->data);
	}
	
	return OK;
}
status PNodeK(Telemtype &e,int &k,Btree T)
{  	
	if(T){
		k--;
		if(k==0){
			e=T->data;
			return OK;
		}
		if(T->lchild==NULL&&T->rchild==NULL)
			return OK;	
		PNodeK(e,k,T->lchild);
		PNodeK(e,k,T->rchild);
	}
}
//4、	編寫求二叉樹葉子結點數的函式。
int leavecount(Btree T)    //求葉子結點數
{  
	int n;
	if(T==NULL) return 0;
	if(T->lchild == NULL && T->rchild ==NULL) return 1;
	else n=leavecount(T->lchild)+leavecount(T->rchild);
	return n;
}
//5、輸入主函式對上面各個函式實現呼叫,記錄並分析程式的執行結果。
int main()
{ 
	Btree T=NULL;
	Telemtype e=0;
	int k;
	int n;
	printf("輸入按先序建立二叉樹的序列,如:ABC##DE#G##F###\n");
	if(T=create(T))
	{ 	
		printf("先序遍歷OK\n");
		pre_display(T);
		
		printf("\n中序遍歷OK\n");
		in_display(T);
		
		printf("\n後序遍歷OK\n");
		post_display(T);
		
		n=leavecount(T);
		printf("\n葉子結點數n=%d \n",n);
	}
	else
		printf("ERROR");
	printf("請輸入位置K?");
	scanf("%d",&k);
	int m=k;
	PNodeK(e,k,T);
	if(e!=0)
	printf("先序遍歷中,第%d個位置的值是:%c",m,e); 
	else printf("未找到!");
}