查詢-二叉排序樹查詢
阿新 • • 發佈:2019-01-08
二叉排序樹的性質:
(1)若某節點的左子樹非空,則左子樹上所有元素的值都小於該元素的值。
(2)若某節點的右子樹非空,則右子樹上所有元素的值都大於該元素的值。
問題:在二叉排序樹種,原則上各元素關鍵字是唯一的。然而在實際運用中,不能保證各元素之間的關鍵字都不相同。因此性質中,可以把”大於“或”小於“修改成”大於等於“或者“小於等於”。
特點:
1.二叉排序樹是有序的
2.構造的二叉排序樹高度越小,其查詢的效率越高。
時間複雜度:
O(nlog2(n))
優點:無須移動元素,只修改指標就實現插入和刪除操作。
程式碼:
#include<stdio.h> #include<malloc.h> int path[100]; //資料表 typedef struct node { int key; struct node *lchild,*rchild; }BSTNode; //插入資料 int InsertBST(BSTNode *&p,int k) { if(p==NULL) { p=(BSTNode*)malloc(sizeof(BSTNode)); p->key=k; p->lchild=NULL; p->rchild=NULL; return 1; } else if(k==p->key) { return 0; } else if(k<p->key) { return InsertBST(p->rchild,k); } else { return InsertBST(p->rchild,k); } } //建立二叉樹 BSTNode *CreateBST(int arr[],int n) { BSTNode *bt=NULL; int i=0; while(i<n) if(InsertBST(bt,arr[i])==1) { i++; } return bt; } //非遞迴查詢 void SearchBST_NoRec(BSTNode *bt,int k,int path[],int i) { int j; if(bt==NULL) { return; } else if(k==bt->key) { path[i]=bt->key; for(j=0;j<=i;j++) printf("%3d",path[j]); printf("\n"); } else { path[i]=bt->key; if(k<bt->key) SearchBST_NoRec(bt->lchild,k,path,i+1); else SearchBST_NoRec(bt->rchild,k,path,i+1); } } //遞迴查詢 int SearchBST_Rec(BSTNode *bt,int k) { if(bt==NULL) return 0; else if(k==bt->key) { printf("%3d",bt->key); return 1; } else if(k<bt->key) SearchBST_Rec(bt->lchild,k); else SearchBST_Rec(bt->rchild,k); printf("%3d",bt->key); } void main() { BSTNode *bt; int k=6; int arr[]={4,9,0,1,8,6,3,5,2,7},n=10; bt=CreateBST(arr,n); printf("查詢%d關鍵字(非遞迴):",k); SearchBST_NoRec(bt,k,path,0); printf("查詢%d關鍵字(遞迴):",k); SearchBST_Rec(bt,k); }