二叉搜尋樹的c 類模板封裝實現

2021-08-22 04:51:47 字數 4378 閱讀 3679

二叉搜尋樹:乙個近似二分搜尋的資料結構跳表有點像,平衡二叉樹可以靠旋轉操作維護自平衡性,解決退化為鍊錶問題;跳表通過隨機函式進行上層節點增刪,統計意義上維護平衡性。

c++實現**:

binary_searchtree.h

hpp檔案 實現類的成員函式

測試檔案

測試執行結果

缺點:二叉搜尋樹:二叉搜尋樹是由二叉樹來組織的,樹中每乙個子樹的根節點key值都大於左樹的key值而小於右子樹的key值。

二叉搜尋樹的中序遍歷key值恰好是從小到達排序。查詢二叉樹、minmum、maxmum、insert和delete等操作時間複雜                    度為o(h); h為樹的高度log2(n);

標頭檔案,樹節點和樹 類的定義

#ifndef _binary_searchtree

#define _binary_searchtree

template//定義element類,便於外部呼叫函式更改資料型別

class element

;templateclass bst;//bst模板類的宣告

templateclass bstnode

;template//搜尋二叉樹模板類

class bst

;#endif

#include"binary_searchtree.h"

#include"iostream"

using namespace std;

//節點的成員函式

//節點內容獲取

templatevoid bstnode::display(int i)

//獲取節點element

templateelementbstnode::getelement()

//樹的成員函式

//構造初始化

templatebst::bst(bstnode*init = null)

//插入節點

templatebool bst::bst_insert(const element&node)

if (node.key > q->data.key)

else

}//建立新節點儲存插入元素

q = new bstnode;

q->data = node;//element資料型別淺拷貝,若element包含指標元素得過載=操作符

q->leftchild = null;

q->rightchild = null;

//空樹的情況

if (root == null)

else

else

}return true;

}//點展示樹左右子樹

//根據節點遞迴顯示左右子樹

templatevoid bst::display()

else

}//查詢節點 遞迴方法

//遞迴的部分需要傳入根節點(bstnode)

//外部以element型別載入資料,故寫兩個函式,改為乙個element埠

templatebstnode*bst::bst_search(const element&node)

templatebstnode*bst::bst_search(bstnode*b, const element&node)

if (node.key == b->data.key)

else if (node.key < b->data.key)

else

}//非遞迴查詢 迭代方式實際中對大多數計算機更有效

templatebstnode*bst::bst_search_iterator(const element&node)

else if (node.key < t->data.key)

else

}} //刪除節點

templatebool bst::delete_node(const element&node)

bstnode*del = null;

bstnode*pcurr = root;

bstnode*parent = null;

while (pcurr != null && pcurr->data.key != node.key)//先找到

if (node.key > pcurr->data.key)

}if (pcurr == null)//找了一遍沒找到

if (pcurr->leftchild == null)//只有右孩子

else if (pcurr == parent->rightchild)//若待刪除節點是parent右孩子

del = pcurr;

} else if (pcurr->rightchild == null)//只有左孩子

else

del = pcurr;

} else//既有左孩子又有右孩子 找到右子樹最小(最左)的元素替換,在按照以上方式刪除

del = left;

pcurr->data.key = left->data.key;//交換節點的值

if (parent->leftchild == left)

else//當pcurr只有乙個右節點時,left是parent的右子樹

}delete del;

} //中序遍歷

templatevoid bst::midorder()

templatevoid bst::midorder(bstnode*root)

midorder(root->leftchild);

cout

midorder(root->rightchild);

} //返回樹中最小的節點

templatebstnode* bst::minmum()

return tmp;

} //返回樹種最大的節點

templatebstnode* bst::maxmum()

return tmp;

}templatebst::~bst()

templatevoid bst::deltree(bstnode*root)

}

#include"dm_04_bst.hpp"

#include"iostream"

#include"cmath"

using namespace std;

void main()

{ elementa,b,c,d,e,f,g,h;

bsttree;

a.key = 5; a.name = 'a'; cout << tree.bst_insert(a) << endl;

b.key = 2; b.name = 'b'; cout << tree.bst_insert(b) << endl;

c.key = 7; c.name = 'c'; cout << tree.bst_insert(c) << endl;

d.key = 1; d.name = 'd'; cout << tree.bst_insert(d) << endl;

e.key = 6; e.name = 'e'; cout << tree.bst_insert(e) << endl;

f.key = 8; f.name = 'f'; cout << tree.bst_insert(f) << endl;

g.key = 4; g.name = 'g'; cout << tree.bst_insert(g) << endl;

h.key = 0; h.name = 'h'; cout << tree.bst_insert(h) << endl;

//列印二叉樹,從根節點開始,遞迴列印左右

tree.display();

cout << "遞迴搜尋key" << endl;

coutgetelement();

cout << "key: " << max.key << " name: " << max.name << endl;

cout << "二叉搜尋樹中鍵值最小的" << endl;

二叉搜尋樹,在一定條件下會退化為鍊錶,失去二叉搜尋樹的優點,構建二叉搜尋樹應當隨機構建二叉搜尋樹,n個節點n!中排序,每一種排序等概。

平衡二叉樹紅黑樹可以解決這個問題,有時間在努力封裝一下紅黑樹吧。

有些頹廢,希望自己能珍惜時間。

C 模板實現二叉搜尋樹

二叉搜尋樹的增刪該查操作實現 插入操作 借助輔助遞迴函式node insert node node,key key,value value 像根節點為node的二叉搜尋樹插入乙個資料,返回值為根節點,如果node null,那麼新建乙個節點返回,如果keykey,則插入到左子樹,當前返回的根節點為左...

模板 二叉搜尋樹

二叉搜尋樹 對於二叉樹中的任意節點,左子樹中所有的值都小於當前位置的值,右子樹中所有的值都大於當前位置的值。操作 1.插入乙個數值。2.查詢是否包含某個數值。3.刪除某個數值。插入和查詢是差不多的,都是比當前值 要找的值 大就往左走,否則就往右走,直到找到為止。最複雜的操作是刪除某個節點,不過可以分...

二叉搜尋樹(模板)

題意 先給一組資料構建一顆二叉搜尋樹作為標準樹。緊跟著n組資料中,判斷每組 資料構成的二叉搜尋樹是否和標準樹yi一樣。思路 兩棵樹如果一樣的話,就是擁有一樣的節點,在每個節點上具有相同的值,且 在相同遍歷條件下,遍歷的順序是一樣的。因此我們可以在遍歷二叉樹的時候,每向 下移動乙個節點時,判斷是否與此...