1. 程式人生 > >C語言實現二叉查詢樹的輸出

C語言實現二叉查詢樹的輸出

二叉樹是資料結構和演算法中的重要部分。本文將簡單介紹其中的一類——二叉查詢樹:

        二叉排序樹(BinarySortTree),又稱二叉查詢樹、二叉搜尋樹。它或者是一棵空樹;或者是具有下列性質的二叉樹:若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;左、右子樹也分別為二叉排序樹。若子樹為空,查詢不成功。

二叉查詢樹的輸出方式也有多種,本文簡單介紹二叉查詢樹的前序、中序和後序輸出以及按層輸出,具體程式碼實現如下:

前序、中序和後序輸出可以利用遞迴方法實現:

前序輸出程式碼實現:

//前序遍歷二叉樹輸出
#include<stdio.h>
#include<stdlib.h>
//建立二叉樹結構體 
typedef struct node{
	int data;
	struct node *left,*right;
}BTNode;
//建立二叉樹 
BTNode *CreateBTree(int a[],int n)
{
	BTNode *root,*c,*p,*pa;
	root=(BTNode*)malloc(sizeof(BTNode));      //建立根結點 
	root->data=a[0];
	root->left=root->right=NULL;
//	建立其他結點 
	for(int i=1;i<n;i++){
		p=(BTNode*)malloc(sizeof(BTNode));
		p->data=a[i];
		p->left=p->right=NULL;
		c=root;
		while(c){
			pa=c;
			if(c->data>p->data)   c=c->left;
			else                  c=c->right;
		}
		if(pa->data>p->data)      pa->left=p;
		else                      pa->right=p;
	}
	return root;
 } 
// 輸出二叉樹 
 void Forder(BTNode *root)
 {
 	if(root){
// 		前序遍歷輸出 
 		printf("%5d",root->data);
 	    Forder(root->left);
 	    Forder(root->right);
	 }
	 else  return;
 }
 int main(void)
 {
 	int a[9]={6,2,3,7,4,8,5,9,1};
 	BTNode *root;    //建立根結點 
 	root=CreateBTree(a,9);
 	Forder(root);//前序輸出二叉樹 
 	return 0;
 }
中序輸出程式碼實現(可得到遞增序列):
//中序遍歷二叉樹輸出 
#include<stdio.h>
#include<stdlib.h>
#define N  9
typedef struct node{
	int data;
	struct node *left, *right;
}BTNode;
BTNode*CreateBTree(int a[],int n)
{
	BTNode* root,*c,*pa,*p;
//	建立根結點 
	root=(BTNode*)malloc(sizeof(BTNode));
	root->data=a[0];
	root->left=root->right=NULL;
//	建立其他結點
    for(int i=1;i<n;i++)
	{
		p=(BTNode*)malloc(sizeof(BTNode));
		p->data=a[i];
		p->left=p->right=NULL;
		c=root;
		while(c){
			pa=c;
			if(c->data>p->data)   c=c->left;
			else                  c=c->right;
		}
		if(pa->data>p->data)  pa->left=p;
		else                  pa->right=p; 
	 } 
	 	return root;
}
//利用中序遍歷輸出
void Inorder(BTNode *root)
{	
 if(!root)    return;
 else{ 
 	Inorder(root->left);
 	printf("%5d",root->data);
 	Inorder(root->right);
 }
 }
 int main(void)
 {
 	int a[9]={6,2,3,7,4,8,5,9,1};
 	BTNode *root;
// 	建立搜尋二叉樹
    root=CreateBTree(a,9);
//	中序遍歷
   Inorder(root);
   return 0; 
  } 
  
後序輸出程式碼實現:
 //後序遍歷二叉樹輸出
#include<stdio.h>
#include<stdlib.h>
//建立二叉樹結構體 
typedef struct node{
	int data;
	struct node *left,*right;
}BTNode;
//建立二叉樹 
BTNode *CreateBTree(int a[],int n)
{
	BTNode *p,*c,*pa,*root;
	root=(BTNode*)malloc(sizeof(BTNode));   //建立根結點 
	root->data=a[0];
	root->left=root->right=NULL;
//	建立其他結點 
	for(int i=1;i<n;i++){
		p=(BTNode*)malloc(sizeof(BTNode));
		p->data=a[i];
		p->left=p->right=NULL;
		c=root;
		while(c){
			pa=c;
			if(c->data>p->data)   c=c->left;
			else                  c=c->right;
		}
		if(pa->data>p->data)      pa->left=p;
		else                      pa->right=p;
	}
	return root;
 } 
// 後序輸出二叉樹 
 void Porder(BTNode*root)
 {
 	if(root){
 	Porder(root->left);
	Porder(root->right);
	printf("%5d",root->data);	
	 }
	 else return;
 }
 int main(void)
 {
 	int a[9]={6,2,3,7,4,8,5,9,1};
 	BTNode *root;
// 	建立根結點 
 	root=CreateBTree(a,9);
// 	後序輸出二叉樹 
 	Porder(root);
 	return 0;
 }
 
由於按層輸出沒有辦法利用遞迴實現,所以我們採取非遞迴方法實現按層輸出。

按層輸出程式碼實現:

 //按層輸出二叉樹 
#include<stdio.h>
#include<stdlib.h>
#define size 100 
//建立二叉樹結構體 
typedef struct node{
	int data;
	struct node *left,*right;
}BTNode;
//建立二叉樹 
BTNode *CreateBTree(int a[],int n)
{
	BTNode *root,*c,*p,*pa;
	root=(BTNode*)malloc(sizeof(BTNode));      //建立根結點 
	root->data=a[0];
	root->left=root->right=NULL;
//	建立其他結點 
	for(int i=1;i<n;i++){
		p=(BTNode*)malloc(sizeof(BTNode));
		p->data=a[i];
		p->left=p->right=NULL;
		c=root;
		while(c){
			pa=c;
			if(c->data>p->data)   c=c->left;
			else                  c=c->right;
		}
		if(pa->data>p->data)      pa->left=p;
		else                      pa->right=p;
	}
	return root;
 } 
// 輸出二叉樹 
 void postorder(BTNode *root)
 {
 	BTNode**Q;
 	BTNode *p;
 	int front,rear;
// 	建立佇列
	Q=(BTNode**)malloc(size*sizeof(BTNode*));
	front=rear=0;
//	初始化
	rear=(rear+1)%size;
	Q[rear]=root;
//	非遞迴按層
	while(front-rear)//佇列非空
	{
		front=(front+1)%size;//出佇列
		p=Q[front];
		printf("%5d",p->data);
		if(p->left){
			rear=(rear+1)%size;//左子樹入佇列 
			Q[rear]=p->left;
		} 
		if(p->right){
			rear=(rear+1)%size;//右子樹入佇列 
			Q[rear]=p->right;
		} 
	
	 } 
	free(Q);
 }
 int main(void)
 {
 	int a[9]={6,2,3,7,4,8,5,9,1};
 	BTNode *root;    //建立根結點 
 	root=CreateBTree(a,9);
 	postorder(root);//按層輸出二叉樹 
 	return 0;
 }