C 模板實現二叉搜尋樹

2021-09-11 02:34:30 字數 2837 閱讀 5552

二叉搜尋樹的增刪該查操作實現

插入操作:借助輔助遞迴函式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...