二叉搜尋樹的增刪該查操作實現
插入操作:借助輔助遞迴函式node* insert(node *node, key key, value value),像根節點為node的二叉搜尋樹插入乙個資料,返回值為根節點,如果node==null,那麼新建乙個節點返回,如果keykey, 則插入到左子樹,當前返回的根節點為左子數。反之則到右子數
查詢操作可以不用遞迴實現,直接使用while迴圈,根據大小到左右子樹查詢,這裡的遞迴比較容易理解,其中查詢返回的value的指標,來處理value不存在的情況。
遍歷操作包括基本的三種dfs遍歷,和層序遍歷bfs遍歷。
刪除操作包括刪除最小值,刪除最大值,刪除任意值
最小值一定沒有左孩子,所以借助乙個輔助的遞迴函式,node* removemin(node* node),刪除以node為根節點的最小值,返回值為當前的根節點,如果node->left==null(node為最小值),根節點為node->right,否則遞迴的到左子樹中進行刪除,根節點為node->left
最大值一定沒有右孩子,同樣可以借助乙個輔助的遞迴函式,node* removemax(node* node), 刪除以node為根節點的最大值,返回值為當前的根節點,如果node->right==null(node為最大值),根節點為node->left,否則遞迴的到右子數中進行刪除,根節點為node->right
刪除任意節點操作用同樣的遞迴方式實現,首先通過遞迴刪除找到要刪除的節點。如果左兒子為空或者右兒子為空,那麼用前面的方法刪除就行。如果不是,那麼尋找左子數的最大值,或者右子數的最小值,刪除右子數的最小值,返回的根節點為拷貝的右子數的最小值,拷貝的右子數的最小值的左耳子為前面節點的左兒子,然後刪除要刪除的節點。
#include #include #include using namespace std;
templateclass bst
node(node *node)
}; node *root;
int count;
public:
bst()
~bst()
int size()
bool isempty()
void insert(key key, value value)
bool contain(key key)
value* search(key key)
void preorder()
void destory()
void levelorder() }
// 尋找最小的鍵值
key minimum()
// 尋找最大的鍵值
key maximun()
// 從二叉樹刪除最小值
void removemin()
void removemax()
private:
// 向node為根的二叉搜尋樹中,插入節點(key, value)
// 返回插入新節點的二叉搜尋樹的根
node* insert(node *node, key key, value value)
if (key == node->key)
node->value = value;
else if (key < node->key)
node->left = insert(node->left, key, value);
else
node->right = insert(node->right, key, value);
return node;
} bool contain(node* node, key key)
value* search(node* node, key key)
else if (key < node->key)
else
return search(node->right, key);
} void preorder(node* node)
} void destory(node* node)
} node* minimum(node* node)
node* maximum(node* node)
void remove(key key)
// 刪除掉以node為根的二分搜尋樹中的最小節點
// 返回刪除節點後新的二分搜尋樹的根
node* removemin(node* node)
node->left = removemin(node->left); }
// 刪除掉以node為根的二分搜尋樹中的最大節點
// 返回刪除節點後新的二分搜尋樹的根
node* removemax(node* node)
node->right = removemax(node->right);
} // 刪除掉以node為根的二分搜尋樹中鍵值為key的節點
// 返回刪除節點後新的二分搜尋樹的根
node* remove(node* node, key key)
else if (key > node->key)
else
if (node->right == null)
node *successor = new node(minimum(node->right)); //右子樹的最小值
count++;
successor->right = removemin(node->right);
successor->left = node->left;
delete node;
count--;
return successor;
} }};
二叉查詢樹 模板實現 C
二叉查詢樹 模板實現 c 1 二叉查詢樹的性質 對於樹中每個結點x,它的左子樹中所有項的值小於x中的值,而它的右子樹中所有項的值大於x中的值。2 二叉樹的操作主要是 插入,刪除,查詢。2.1 查詢 contains 實現思路 如果待查詢的項x在樹中,返回true 否則返回false。若當前比較的結點...
c 模板實現 二叉查詢樹
搗鼓了乙個晚上,最後還是照著書本把這bst弄出來了。悲催的娃娃啊,不動手寫這個還真的很難啊!1 ifndef btree h 2 define btree h 34 include 5 using std ostream 67 template 8class bstree917 bstnode tr...
類模板實現二叉查詢樹
二叉查詢樹是一種特殊的二叉樹,這種樹上不存在重複的結點,而且它上面的左子樹都比其父結點小,它上面的右子樹都比其父結點大。值得注意的是 具有相同資料的二叉查詢樹會隨著資料插入順序不同而不同。在treenode.h中 在tree.h中 在tree.cpp中 在main.cpp中 值得注意的幾點 1.te...