1. 程式人生 > >C語言實現二叉樹的建立&遍歷

C語言實現二叉樹的建立&遍歷

演算法思想(重點是遞迴的使用) 
利用擴充套件先序遍歷序列建立二叉連結串列
採用類似先序遍歷的遞迴演算法,首先讀入當前根結點的資料,如果是'.'則將當前
樹根置為空,否則申請一個新結點,存入當前根結點的資料,分別用當前根結點的
左子域和右子域進行遞迴呼叫,建立左、右子樹. 

#include <stdio.h>
#include <stdlib.h>

typedef char DataType;        	 //二叉連結串列結點的資料型別 

typedef struct Node          	 //定義二叉樹的二叉連結串列結點結構 
{
	DataType data;
	struct Node *LChild;         //左子樹 
	struct Node *RChild;	     //右子樹 	
}BiTNode,*BiTree;

void CreateBiTree(BiTree *bt);   //建立二叉連結串列函式 
void PreOrder(BiTree root);      //先序遍歷二叉樹
void InOrder(BiTree root);       //中序遍歷二叉樹
void PostOrder(BiTree root);     //後序遍歷二叉樹

int main()
{
	BiTree bt;
	int choice;
	while(true)
	{                   //二叉樹操作選擇選單 
	printf("*****************Please enter your choice*****************\n\n");
	printf("                choice 1:建立二叉樹\n");
        printf("                choice 2:先序遍歷二叉樹\n");
        printf("                choice 3:中序遍歷二叉樹\n");
        printf("                choice 4:後序遍歷二叉樹\n");
        printf("                choice 0:退出\n\n");
		scanf("%d",&choice);
		switch(choice)
		{
			case 1: CreateBiTree(&bt);
					break;
			case 2: PreOrder(bt);             
              		printf("\n");
               		break;

            case 3: InOrder(bt);               
                	printf("\n");
               		break;
            case 4: PostOrder(bt);                
                	printf("\n");
               		break;
			case 0: exit(0);				
				    break;
			default:
				printf("ERROR!!\n");
				exit(0);
				break;
		}		
	}
	return 0; 
} 

void CreateBiTree(BiTree *bt)
{
	char ch;
	printf("Please enter data:");
	getchar();
	ch = getchar();
	if(ch == '.')              //讀入的資料是'.'則將當前樹根置為空 
	{
		*bt = NULL;
	}
	else                      //讀入正常資料,為當前樹根分配地址空間 
	{
		*bt = (BiTree)malloc(sizeof(BiTNode));
		(*bt)->data = ch;
		CreateBiTree(&((*bt)->LChild)); //遞迴呼叫CreateBiTree()函式,處理左子樹 
		CreateBiTree(&((*bt)->RChild)); //遞迴呼叫CreateBiTree()函式,處理右子樹 
	}
}

void PreOrder(BiTree root) //先序遍歷二叉樹,root為指向二叉樹根結點的指標 
{
	if(root!=NULL)    
	{
		printf("%c ",root->data);  	//訪問根結點 
		PreOrder(root->LChild);    	//先序遍歷左子樹 
		PreOrder(root->RChild);		//先序遍歷右子樹
	}
}

void InOrder(BiTree root)    //中序遍歷二叉樹,root為指向二叉樹根結點的指標
{ 
    if(root!=NULL)    
    {
        InOrder(root->LChild);      //中序遍歷左子樹
        printf("%c ",root->data);  	//訪問根結點 
        InOrder(root->RChild);      //中序遍歷右子樹
    }
}

void PostOrder(BiTree root)     //中序遍歷二叉樹,root為指向二叉樹根結點的指標
{ 
    if(root!=NULL)             
    {
        PostOrder(root->LChild);      //後序遍歷左子樹
        PostOrder(root->RChild);      //後序遍歷右子樹
        printf("%c ",root->data);  	//訪問根結點 
    }
}