什麼是二叉搜索樹呢?它與別的數據結構相比其優勢又是什麼呢?
一顆二叉搜索樹就是以一顆二叉樹來組織和存儲數據的,如圖所示(圖a是包含6個節點、高度爲2的二叉樹,圖b是包含相同關鍵字、高度爲4的低效二叉樹)。對比博文前面所介紹的鏈表,二叉樹也是可以用結構體來實現,只不過每個節點裏面不僅要保存數據本身的關鍵字(稱之爲key),還要有左節點(左孩子left)、右節點(右孩子right)、父節點(p);根節點的父節點爲NULL。基本概念瞭解後,我們要明確二叉樹要滿足:對每個節點而言,其中保存的關鍵字key不小於其左孩子的key,要不大於其右孩子的key。
接下來我們要明確的是採用該種數據結構的優勢:二叉樹上的基本操作(查找,找到最小值,找到最大值,找到一個節點的前驅或後繼,插入,刪除等)所花費的時間與樹的高度成正比。(證明見算法書第十二章)
那我們只要知道這樣的數據結構什麼時候用好就ok了,下面的代碼也不用自己會編,關鍵是編碼思想的掌握。
然後就是代碼實現一些基本操作(Search、MinNum、MaxNum、Predecessor、Successor、Insert、Delete)
#include<iostream>
struct ListNodeOfBinaryTree
{
int key;
ListNodeOfBinaryTree* p;
ListNodeOfBinaryTree* left;
ListNodeOfBinaryTree* right;
};
void InorderTreeWalk(ListNodeOfBinaryTree* x) {
if (x) {
InorderTreeWalk(x->left);
std::cout << x->key << " ";
InorderTreeWalk(x->right);
}
}//中序遍歷輸出
ListNodeOfBinaryTree* TreeSearch(ListNodeOfBinaryTree* x, int k) {
/*if (!x||x->key == k) return x;
if (x->key>k) {
return TreeSearch(x->right, k);
}
else return TreeSearch(x->left, k);遞歸版本*/
while (x&&x->key != k) {
if (x->key > k) {
x = x->left;
}
else x = x->right;
}
return x;
}//在以x爲根的樹中查找關鍵字爲k的元素位置。
ListNodeOfBinaryTree* MinNum(ListNodeOfBinaryTree* x) {
while (x->left) {
x = x->left;
}
return x;
}
ListNodeOfBinaryTree* MaxNum(ListNodeOfBinaryTree* x) {
while (x->right) {
x = x->right;
}
return x;
}