排序二叉樹的實現和我的乙個資料結構設計

2021-07-26 07:07:44 字數 2444 閱讀 7384

一。基本概念

二叉排序樹又稱二叉搜尋樹,即在樹的任何乙個結點,都滿足左子樹小於根,根小於右子樹。排序二叉樹可以作為map的關鍵碼。主要的作用是快速的查詢(相當於二分法)

二。基本演算法

1.查詢

查詢時,首先和根結點對比,若相等,則查詢成功。若大於根,則再向右子樹查詢;如果小於根,則向根的左子樹查詢;依次類推,直到查詢成功或者遇到空結點。

2.插入

找到要插入的位置,類似於上面查詢的方式,將新結點插入到查詢到的左子樹或者右子樹。

3.刪除

1.當要刪除結點不存在左子樹,直接將要刪除結點的右子樹賦給要刪除點的父結點的相應子結點

2.當要刪除的結點存在左子樹,在此結點的左子樹中,查詢到關鍵碼最大的乙個結點r,將r的右指標指要要刪除點的右子樹,用要刪除點的左子樹代替要刪除點

三。具體**宣告

1 template 

2class binsearchtree

3 11

public:

12 key key;

13 binsearchtree* llink;

14 binsearchtree* rlink;

1516

17int search(key key,binsearchtree** position);

18int insert(key key);

19int delete_node(key key);

20 };

實現

1 template

2int binsearchtree::search(key key,binsearchtree** pos)

3 13

else

if(p->key > key )

16else

19 }

2021

return

0;22 }

23 template

24int binsearchtree::insert(key key)

25 30 binsearchtree* p = new binsearchtree(key);

31//

如果pos null,說明是空樹

32if(!pos)

35else

if( pos->key > key )

38else

4142

return

0;43 }

44 template

45int binsearchtree::delete_node(key key)

46 54 parent = p;//

在向下個結點遍歷前,將本結點設定為父結點

5556

if( key > p->key )

59else

62 }

63if( !p )

6667

//1.如果沒有左子樹,則直接被刪除結點用右子樹代替

68if(!p->llink)

72else

if(parent->rlink == p)

75 delete p;

76return

0;77 }

78//

2.如果有有左子樹,則找到左子樹里最大的結點,將其右子樹設定成要查詢的子樹的右子樹。並將欲查詢的子樹用它的左子樹代替

79 binsearchtree* r = null;//

r為要查詢的結點的左子樹的最遠端右子樹

80 r = p->llink;

81while(r->rlink)r = r->rlink;

8283 r->rlink = p->rlink;

8485

if(parent->llink == p)

88else

if(parent->rlink == p)

9192

93 }

四。我的新設計

1.使用乙個順序結構儲存(比如陣列)實際物件 假設叫做list

2.使用乙個二叉排序樹tree儲存list中儲存的元素(每個元素是乙個物件)的指標或者引用。

3.每次對list新增,刪除時,對tree都要做相應的操作

優點:相當於實現了乙個簡單的map,可以使用兩種方式定位資料物件。比如遊戲中儲存玩家類,大部分時間是通過id取得玩家物件的,即通過list(索引號)的方式,但同時也可能存在使用名字取得玩家物件的情況,可以把名字存在tree中。tree只是list的乙個資料對映,耗費較少的記憶體。當然,直接使用map《名字,索引號》的方式也是可以的。

還有乙個優點是可以比較方便的查詢到最大和最小值。

缺點:不能插入重複的資料。

缺點:

二叉樹 排序二叉樹的簡單實現

二叉樹 排序二叉樹 include using namespace std 二叉樹的節點 date 資料 left 指向二叉樹的左子樹 right 指向二叉樹的右子樹 template struct node template class btree public btree root null c...

排序二叉樹的實現

在電腦科學中,二叉樹是一種重要的非線性的資料結構。每個結點的度均小於等於2,通常子樹稱為左子樹和右子樹。而排序二叉樹是二叉樹中的一種,其滿足 1.如左子樹不為空,那麼左子樹上的結點的值都小於其根上的值 2.如右子樹不為空,那麼右子樹上的結點的值都大於其根上的值 3.其子樹也是乙個排序二叉樹。下面用遞...

排序二叉樹的實現

coding utf8 class node def init self,item self.item item self.left none self.right none class sorttree def init self self.root none defadd self,item n...