資料結構 二叉搜尋樹

2021-07-26 07:01:43 字數 2860 閱讀 4767

二叉搜尋樹,又名二叉排序樹,二叉查詢樹

二叉搜尋樹有一下特點:

(1)若左子樹不為空,則左子樹的所有節點均小於根節點

(2)若右子樹不為空,則右子樹的所有節點均大於根節點

(3)左右子樹也是二叉搜尋樹

(4)每棵樹都有自己的key值,而且不能重複

//二叉搜尋樹的節點,key-value結構

templatestruct researchbinarytreenode

;//定義二叉搜尋樹

templateclass researchbinarytree

;

二叉搜尋樹的查詢,就是從根節點開始,進行key值的比較

若相同,則查詢到;若大於查詢的key值,則走左孩子;小於的話走右孩子;如果為空,則沒找到

node* find(const k& key)

return null;

}

node* findr(const k& key)

node* _findr(node* root, const k& key)

bool insert(const k& key,const v& value)

node* cur = _root;

node* parent = cur;

//找到需要插入節點的父親節點

while (cur)

//parent為需要插入節點的父親節點

if (parent->_key > key)

parent->_left = new node(key,value);

else if (parent->_key_right = new node(key,value);

return true;

}

bool insertr(const k& key, const v& value)

bool _insertr(node*& root, const k& key, const v& value)

if (key < root->_key)

return _insertr(root->_left, key, value);

else if (key > root->_key)

return _insertr(root->_right, key, value);

else

return false;

}

二叉搜尋樹稍微複雜一點的地方就是刪除部分,在刪除乙個節點的時候,有四種情況

(1)刪除節點的左子樹為空  如

刪除節點6

(2)刪除節點的右子樹為空  如刪除節點9

(3)刪除節點的左子樹和右子樹都為空 如刪除節點2

(4)刪除節點的左子樹和右子樹都不為空 如刪除節點7

由於當刪除節點的左子樹和右子樹都為空時,左子樹和右子樹都為空,滿足左子樹為空(或右子樹為空)

的條件,因為我們可以將這種情況劃分到左子樹為空的情況中

因此,三種情況的處理結果如下:

(1)若左子樹為空,就讓父親節點指向刪除節點的右子樹;比如刪除6,就讓7指向6的右子樹

(2)若右子樹為空,就讓父親節點指向刪除節點的左子樹;比如刪除3,就讓5指向3的左子樹

(3)若都不為空,則用替換法進行刪除;比如刪除7,就找7的右子樹(9)的最左節點8,將8放到7的位置,然後刪除原來的8

bool remove(const k& key)

else if (key >cur->_key)

else

}if (cur == null)

return false;

//如果刪除的是根節點,那麼parent的值為null

//cur此時是要刪除的節點

if (cur->_left == null)

else if (cur->_right == null)

else

cur->_key = subleft->_key;

if (parent->_left == subleft)

parent->_left = subleft->_right;

else

parent->_right = subleft->_right;

delnode = subleft;

} delete delnode;

delnode = null;

return true;

}

bool remover(const k&key)

bool _remover(node* root,const k& key)

delnode = subleft;

//若為左子樹,代表走了while迴圈,否則沒有走迴圈

//要刪除的節點是subleft

root->_key = subleft->_key;

if (parent->_left == subleft)

parent->_left = subleft->_right;

else

parent->_right = subleft->_right;

delete delnode;

return true;

} }}

二叉搜尋樹c 資料結構二叉搜尋樹

在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...

資料結構(二叉搜尋樹)

二叉搜尋樹是一種可以高效完成以下操作的樹型的資料結構 插入乙個值 查詢是否含有某個值 刪除某個值 它儲存節點的資料資訊時,遵循以下規則,左子樹的值 根節點值 右子樹的值 下面是基本的二叉搜尋樹的實現 include include include includeusing namespace std...

資料結構 二叉搜尋樹

二叉搜尋樹的所有節點都滿足左子樹上的所有節點都比自己小,而右子樹上的所有節點都比自己大這一條件。當刪除某個節點時,需要根據下面幾種情況分別進行處理 需要刪除的節點沒有左兒子,那麼就把右兒子提上去。需要刪除的節點的左兒子沒有右兒子,那麼就把左兒子提上去。以上兩種情況都不滿足的話,就把左兒子的子孫 左子...