二叉搜尋樹

2021-07-13 16:49:26 字數 2874 閱讀 1326

二叉查詢樹(binary search tree)(

二叉搜尋樹

,二叉排序樹)它或者是一棵空樹,或者是具有下

列性質的

二叉樹: 

1. 每個節點都有乙個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不同。

2. 左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。

3. 右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。

4. 左右子樹都是二叉搜尋樹。

對於二叉搜尋樹,在實現它的結點的插入、刪除、查詢時,插入結點不是很複雜,但是對於其刪除有一定的難度。在實現刪除時,要考慮的情況較多。

一、對二叉樹的定義:

templatestruct bstnode

};templateclass bstree

}

對於定義,應該沒什麼問題。那就來說說它的插入、刪除、查詢的實現。

二、插入的實現

對於插入,在此我用兩種方法來實現(遞迴和非遞迴)

首先,非遞迴的方法:(在插入時,都要按照二叉樹的性質來實現即要在合適位置)

思想:1、先考慮根結點為空。

2、儲存上乙個節點,插入時要找上乙個結點。 3、

找到合適的位置(要插入的key小於當前key就往左子樹找反之往右子樹找)

4、找到合適位置後,插入結點。

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

node* cur = _root;

node* parent = null;

while (cur)

else if (cur->_key < key)

else

}if (parent->_key > key)

else

return true;

}

非遞迴完成後,我們來看一下insert的遞迴的形式

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

if (root->_key > key)

else if (root->_key < key)

return false;

}

接下來就是的查詢和刪除,先看一下查詢:

三、查詢的實現(非遞迴形式):

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

else if (cur->_key < key)

else

}return null;

}

查詢的遞迴形式:

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

else

}

四、刪除的實現:(非遞迴)對於刪除,在此需要考慮的情況非常多。

下面是刪除的思想:

(在刪除時,也要和查詢一樣,先查找到要刪除的結點,然後刪除)

1、考慮根結點為空情況和乙個結點情況

2、當有多個結點時,根據上圖中的情形考慮到不同情況

(1)要刪除的左結點的左子樹或右子數為空。

(2)要刪除的結點是根結點。

(3)要刪除的結點的左右結點都不為空。

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

else

}node* cur = root; //多個節點

node* prev = null;

while (cur)

else if (cur->_key < key)

else //找到了要刪除的結點,判斷左子樹是否為空,若為空,把刪除點的左子樹設為刪除點右子樹的左子樹

else

else}}

else if (cur->_right == null)

else

else}}

else //左右都不為空

swap(cur->_key, fistleft->_key);

swap(cur->_value, fistleft->_value);

del = fistleft;

if (prev->_left == fistleft)

else

}delete del;

return true;

}} return false;

}

刪除的遞迴形式:

bool _remove_r(node* &root, const k& key)  //引用

if (root->_key < key)

else if (root->_key > key)

else

else if (root->_right==null)

else

swap(firstleft->_key, root->_key);

swap(firstleft->_value, root->_value);

_remove_r(firstleft,key);

}return true;

} }

五、二叉查詢樹的時間複雜度

它和二分查詢一樣,插入和查詢的時間複雜度均為lgn,但是在最壞的情況下仍然會有n的時間複雜度。原因在於插入和刪除元素的時候,樹沒有保持平衡。

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...