二叉搜尋樹的簡單實現

2021-10-07 18:37:50 字數 2032 閱讀 8321

上述條件反之亦可

接近二分查詢,最大查詢次數為樹的高度,平均查詢次數log2 n

template

<

class

t>

struct bstnode};

template

<

class

t>

class

bstree

else

if(cur-

>_val < val)

else

if(cur-

>_val > val)

}return

nullptr;}

private

: node* _root =

nullptr;}

;

如果樹中已存在需要插入的資料,則不重複插入

插入位置為:葉子,子樹不完全的非葉子結點,即度為0或者1的節點位置

bool

insert

(const t& val)

node* cur = _root;

node* parent =

nullptr

;while

(cur)

cur =

newnode

(val);if

(parent-

>_val < val)

parent-

>_right = node;

else

parent-

>_left = cur;

return

true

;}

有以下四種情況

a. 要刪除的結點無孩子結點

b. 要刪除的結點只有左孩子結點

c. 要刪除的結點只有右孩子結點

d. 要刪除的結點有左、右孩子結點

刪除度為2的節點:

找到此節點中,左子樹的最右節點或者右子樹的最左節點

要刪除的節點val替換為最左節點或者最右節點

真正要刪除的是最左或者最右節點

此時問題轉換為刪除度為0或者度為1的節點

bool

erase

(const t& val)

else

if(cur-

>_val < val)

else

}//判斷是否找到需要刪除的節點

if(cur ==

nullptr

)return

false

;//刪除操作

//1. 葉子

if(cur-

>_left ==

nullptr

&& cur-

>_right ==

nullptr

)else

delete cur;

}//2.左孩子為空

else

if(cur-

>_left ==

nullptr

)delete cur;

}//3.右孩子為空

else

if(cur-

>_right ==

nullptr

)delete cur;

}//4.左右孩子都存在

else

//b.值替換

cur-

>_val = leftmostchild-

>_val;

//c.刪除最左或最右節點

if(parent-

>_left == leftmostchild)

parent-

>_left = leftmostchild-

>_right;

else

parent-

>_right = leftmostchild-

>_right;

delete leftmostchild;

}}

二叉搜尋樹的簡單實現

查詢是否有某個元素,找到返回true,找不到返回false public boolean contains int key else if key else return false 插入某元素,如果已經包含該元素則返回false,插入成功就返回true public boolean insert ...

二叉搜尋樹的簡單實現

二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹 1.若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 2.若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值 3.它的左右子樹也分別為二叉搜尋樹 pragma once templatestruct bstre...

bst 二叉搜尋樹簡單實現

陣列實現二叉樹 1.下標為零的元素為根節點,沒有父節點 2.節點i的左兒子是2 i 1 右兒子2 i 2 父節點 i 1 2 3.下標i為奇數則該節點有有兄弟,否則又左兄弟 4.對bst樹的操作主要有插入,刪除,後繼前驅的查詢,樹最大最小節點檢視 include using namespace st...