二叉查詢樹(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 解釋 輸入為 ...