首先介紹下基本概念:二叉排序樹是一棵二叉樹,或者為空白,或者滿足以下條件:
①若左子樹不空,則其上的值均小於根的值;
②若右子樹不空,其上的值均不小於根的值;
③左右子樹也是二叉排序樹
下面以基本的構造二叉排序樹和尋找其中的元素來說明其基本的演算法。
1、構造
構造的基本思想:假設已存在一棵二叉排序樹,需要向其上添加元素。方法是建立一個指向node類型的
指標,將key裝入該指標指向的地區,然後遍曆二叉排序樹以尋找到合適的位置,將建立節點連結上。至於如
何尋找合適位置,則是根據二叉排序樹的特點,在左右子樹不斷尋找,直到找到一個合適的NULL位置。詳見
代碼。
2、尋找
先比較根節點的關鍵字與待查元素的大小關係。如果相等,則表明尋找到,尋找結束;否則,如果前者大
於後者,則在左子樹中尋找;否則,在右子樹中尋找。
代碼如下:
#include<iostream>using namespace std;struct node //節點包含一個關鍵字和左右兩個指向節點的指標{int key;node *lchild;node *rchild;};class bin_search_t //二叉排序樹類{public:bin_search_t();void insert(node *&T,node *u);void create_bst(node *&T);node* visit(node *T,int value);node *root;};bin_search_t::bin_search_t(){root=NULL; //root為NULL決定了insert()和create_bst()都得用root的引用}void bin_search_t::insert(node *&T,node *u) //將u指示的節點元素插入到以T為根的排序樹中{if(T==NULL) //每次都是在空處連結T=u;else if(u->key>T->key)insert(T->rchild,u);elseinsert(T->lchild,u);}void bin_search_t::create_bst(node *&T) //需要引用,因為下面有T=NULL語句,不引用就無法從root處訪問了{node *u=NULL;const int MAX=9999; //標誌構造結束int x;while(1) {cin>>x;if(x==MAX) break;u=new node; u->key=x;u->lchild=NULL;u->rchild=NULL;insert(T,u);}}/*遞迴尋找*/node* bin_search_t::visit(node *T,int value){if(T==NULL || T->key==value ) //把T==NULL放在前面會省去很多麻煩,因為當T==NULL時,T->key會出錯return T;else if(T->key>value)return visit(T->lchild,value);elsereturn visit(T->rchild,value);}/*非遞迴尋找node* bin_search_t_n::visit(node *T,int value){node *p=T;while(p!=NULL){if(p->key==value)return p;else if(p->key>value)p=p->lchild;elsep=p->rchild;}return p;}*/int main(){bin_search_t p;node *q;p.create_bst(p.root);q=p.visit(p.root,9); //以尋找9為例 cout<<q<<endl; //輸出9的位置if(q!=NULL) //根據是否尋找的,輸出 cout<<q->key<<endl;elsecout<<"q==NULL"<<endl;return 0;}