二叉搜尋樹:乙個近似二分搜尋的資料結構跳表有點像,平衡二叉樹可以靠旋轉操作維護自平衡性,解決退化為鍊錶問題;跳表通過隨機函式進行上層節點增刪,統計意義上維護平衡性。
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一樣。思路 兩棵樹如果一樣的話,就是擁有一樣的節點,在每個節點上具有相同的值,且 在相同遍歷條件下,遍歷的順序是一樣的。因此我們可以在遍歷二叉樹的時候,每向 下移動乙個節點時,判斷是否與此...