C語言實現二叉查詢樹的輸出
阿新 • • 發佈:2019-02-15
二叉樹是資料結構和演算法中的重要部分。本文將簡單介紹其中的一類——二叉查詢樹:
二叉排序樹(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;
}