1. 程式人生 > >查詢-二叉排序樹查詢

查詢-二叉排序樹查詢

二叉排序樹的性質:

(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);
}