標籤:style blog http color io os 使用 ar strong
參考:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.3.1.1.htm
1 #include "stdafx.h" 2 #include <iostream> 3 4 typedef int InfoType; //其它資料域,自訂 5 typedef int KeyType; //假定關鍵字類型為整數 6 typedef struct node //結點類型 7 { 8 KeyType key; //關鍵字項 9 InfoType otherinfo; //其它資料域,InfoType視應用情況而定,下面不處理它10 node *lchild, *rchild; //左右孩子指標11 }BSTNode;12 typedef BSTNode *BSTree; //BSTree是二叉排序樹的類型13 14 //非遞迴15 void InsertBSTNode(BSTree *Tptr, KeyType key)16 {//若二叉排序樹 *Tptr中沒有關鍵字為key,則插入,否則直接返回17 BSTNode *f, *p = *Tptr; //p的初值指向根結點18 while(p)19 {20 if(p->key==key) //樹中已有key,無須插入21 return;22 f = p; //記錄23 p = key < p->key ? p->lchild : p->rchild;24 }25 p = new BSTNode;26 p->key = key;27 p->lchild = NULL;28 p->rchild = NULL;29 if(NULL == *Tptr)30 *Tptr = p;31 else32 {33 if (key < f->key)34 f->lchild = p; 35 else36 f->rchild = p;37 } 38 }39 40 BSTree CreateBSTree(KeyType *array, int size)41 {42 BSTNode *root = NULL;43 for (int i=0;i<size;++i)44 InsertBSTNode(&root, array[i]);45 return root;46 }47 48 int _tmain(int argc, _TCHAR* argv[])49 {50 int array[] = {5,3,7,2,4,8};51 int size = sizeof(array)/sizeof(int);52 BSTree tree = CreateBSTree(array, size);53 system("pause");54 return 0;55 }
使用偵錯模式查看構建的二叉尋找樹如
(1) 二叉排序樹的插入和產生
①二叉排序樹插入新結點的過程
在二叉排序樹中插入新結點,要保證插入後仍滿足BST性質。其插入過程是:
(a)若二叉排序樹T為空白,則為待插入的關鍵字key申請一個新結點,並令其為根;
(b)若二叉排序樹T不為空白,則將key和根的關鍵字比較:
(i)若二者相等,則說明樹中已有此關鍵字key,無須插入。
(ii)若key<T→key,則將key插入根的左子樹中。
(iii)若key>T→key,則將它插入根的右子樹中。
子樹中的插入過程與上述的樹中插入過程相同。如此進行下去,直到將key作為一個新的葉結點的關鍵字插入到二叉排序樹中,或者直到發現樹中已有此關鍵字為止。
②二叉排序樹插入新結點的遞迴演算法
【參見參考書目】
③二叉排序樹插入新結點的非遞迴演算法
void InsertBST(BSTree *Tptr,KeyType key)
{ //若二叉排序樹 *Tptr中沒有關鍵字為key,則插入,否則直接返回
BSTNode *f,*p=*TPtr; //p的初值指向根結點
while(p){ //尋找插入位置
if(p->key==key) return;//樹中已有key,無須插入
f=p; //f儲存當前尋找的結點
p=(key<p->key)?p->lchild:p->rchild;
//若key<p->key,則在左子樹中尋找,否則在右子樹中尋找
} //endwhile
p=(BSTNode *)malloc(sizeof(BSTNode));
p->key=key; p->lchild=p->rchild=NULL; //產生新結點
if(*TPtr==NULL) //原樹為空白
*Tptr=p; //新插入的結點為新的根
else //原樹非空時將新結點關p作為關f的左孩子或右孩子插入
if(key<f->key)
f->lchild=p;
else f->rchild=p;
} //InsertBST
④二叉排序樹的產生
二叉排序樹的產生,是從空的二叉排序樹開始,每輸入一個結點資料,就調用一次插入演算法將它插入到當前已產生的二叉排序樹中。產生二叉排序樹的演算法如下:
BSTree CreateBST(void)
{ //輸入一個結點序列,建立一棵二叉排序樹,將根結點指標返回
BSTree T=NULL; //初始時T為空白樹
KeyType key;
scanf("%d",&key); //讀人一個關鍵字
while(key){ //假設key=0是輸人結束標誌
InsertBST(&T,key); //將key插入二叉排序樹T
scanf("%d",&key);//讀人下一關鍵字
}
return T; //返回建立的二叉排序樹的根指標
} //BSTree
⑤二叉排序樹的產生過程
由輸入執行個體(5,3,7,2,4,8),根據產生二叉排序樹演算法產生二叉排序樹的過程【參見動畫示範】
注意:
輸入序列決定了二叉排序樹的形態。
二叉排序樹的中序序列是一個有序序列。所以對於一個任意的關鍵字序列構造一棵二叉排序樹,其實質是對此關鍵字序列進行排序,使其變為有序序列。"排序樹"的名稱也由此而來。通常將這種排序稱為樹排序(Tree Sort),可以證明這種排序的平均執行時間亦為O(nlgn)。
對相同的輸入執行個體,樹排序的執行時間約為堆排序的2至3倍。因此在一般情況下,構造二叉排序樹的目的並非為了排序,而是用它來加速尋找,這是因為在一個有序的集合上尋找通常比在無序集合上尋找更快。因此,人們又常常將二叉排序樹稱為二叉尋找樹。
二叉排序樹(二叉尋找樹)