二叉搜索樹源碼分享
#include <iostream>
using namespace std;
//枚舉類,前中后三種遍歷方式
enum ORDER_MODE
{
ORDER_MODE_PREV = 0,
ORDER_MODE_MID,
ORDER_MODE_POST
};
//樹節(jié)點(diǎn)的結(jié)構(gòu)體
template <class T>
struct BinaryNode
{
T element;
BinaryNode *left;
BinaryNode *right;
BinaryNode(const T& theElement,
BinaryNode *lt,
BinaryNode *rt):
element(theElement),
left(lt),
right(rt)
{
}
};
template <class T>
class BinarySearchTree
{
private:
BinaryNode<T> *m_root;
public:
BinarySearchTree();
BinarySearchTree(const BinarySearchTree& rhs);
~BinarySearchTree();
const T& findMin() const;
const T& findMax() const;
bool contains(const T& x) const;
void printTree(ORDER_MODE eOrderMode = ORDER_MODE_PREV) const;
void makeEmpty();
void insert(const T& x);
void remove(const T& x);
private:
void insert(const T& x, BinaryNode<T>* &t) ;
void remove(const T& x, BinaryNode<T>* &t) ;
BinaryNode<T>* findMin( BinaryNode<T>* t) const;
BinaryNode<T>* findMax( BinaryNode<T>* t) const;
bool contains(const T& x, const BinaryNode<T>* t) const;
void makeEmpty(BinaryNode<T>* &t);
void printTreeInPrev(BinaryNode<T>* t) const;
void printTreeInMid(BinaryNode<T>* t)const;
void printTreeInPost(BinaryNode<T>* t)const;
};
//構(gòu)造方法
template <class T>
BinarySearchTree<T>::BinarySearchTree()
{
m_root = NULL;
}
//使用另一棵二叉搜索樹的構(gòu)造函數(shù)
template <class T>
BinarySearchTree<T>:: BinarySearchTree(const BinarySearchTree& rhs)
{
m_root = rhs.m_root;
}
//析構(gòu)函數(shù),釋放內(nèi)存
template <class T>
BinarySearchTree<T>:: ~BinarySearchTree()
{
makeEmpty();
}
// 判斷x元素是否存在
template <class T>
bool BinarySearchTree<T>::contains(const T& x) const
{
return contains(x, m_root);
}
//遞歸調(diào)用
template <class T>
bool BinarySearchTree<T>::contains(const T& x, const BinaryNode<T>* t) const
{
if (!t)
return false;
else if (x < t->element)
return contains(x, t->left);
else if (x > t->element)
return contains(x, t->right);
else
return true;
}
// 尋找樹中的最小值
template <class T>
const T& BinarySearchTree<T>::findMin() const
{
return findMin(m_root)->element;
}
//遞歸搜索樹中最小值
template <class T>
BinaryNode<T>* BinarySearchTree<T>::findMin( BinaryNode<T>* t) const
{
//二叉樹的一個(gè)特點(diǎn)就是左子葉的值比根節(jié)點(diǎn)小, 右子葉的比根節(jié)點(diǎn)的大
if (!t)
return NULL;
if (t->left == NULL)
return t;
else
return findMin(t->left);
}
// 尋找樹中最大值
template <class T>
const T& BinarySearchTree<T>::findMax() const
{
return findMax(m_root)->element;
}
//遞歸尋找樹中最大值
template <class T>
BinaryNode<T>* BinarySearchTree<T>::findMax( BinaryNode<T>* t) const
{
//二叉樹的一個(gè)特點(diǎn)就是左子葉的值比根節(jié)點(diǎn)小, 右子葉的比根節(jié)點(diǎn)的大
if (t != NULL)
while (t->right != NULL)
t = t->right;
return t;
}
// 插入元素
template <class T>
void BinarySearchTree<T>:: insert(const T& x)
{
insert(x, m_root);
}
//遞歸插入
template <class T>
void BinarySearchTree<T>::insert(const T& x, BinaryNode<T>* &t)
{
if (t == NULL)
t = new BinaryNode<T>(x, NULL, NULL);//注意這個(gè)指針參數(shù)是引用
else if (x < t->element)
insert(x, t->left);
else if (x > t->element)
insert(x, t->right);
else
;//do nothing
}
//移除元素
template <class T>
void BinarySearchTree<T>::remove(const T& x)
{
return remove(x, m_root);
}
//遞歸移除
template <class T>
void BinarySearchTree<T>::remove(const T& x, BinaryNode<T>* &t)
{
if (t == NULL)
return;
if (x < t->element)
remove(x, t->left);
else if (x > t->element)
remove (x, t->right);
else // now ==
{
if (t->left != NULL &&
t->right != NULL)//two child
{
t->element = findMin(t->right)->element;
remove(t->element, t->right);
}
else
{
BinaryNode<T> *oldNode = t;
t = (t->left != NULL) ? t->left : t->right;
delete oldNode;
}
}
}
//清空二叉樹
template <class T>
void BinarySearchTree<T>::makeEmpty()
{
makeEmpty(m_root);
}
//遞歸清空
template <class T>
void BinarySearchTree<T>::makeEmpty(BinaryNode<T>* &t)
{
if (t)
{
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
}
t = NULL;
}
// 打印二叉搜索樹
template <class T>
void BinarySearchTree<T>::printTree(ORDER_MODE eOrderMode /*= ORDER_MODE_PREV*/) const
{
if (ORDER_MODE_PREV == eOrderMode)
printTreeInPrev(m_root);
else if (ORDER_MODE_MID == eOrderMode)
printTreeInMid(m_root);
else if (ORDER_MODE_POST == eOrderMode)
printTreeInPost(m_root);
else
;//do nothing
}
//前序打印
template <class T>
void BinarySearchTree<T>::printTreeInPrev(BinaryNode<T>* t) const
{
if (t)
{
cout << t->element;
printTreeInPrev(t->left);
printTreeInPrev(t->right);
}
}
//中序打印
template <class T>
void BinarySearchTree<T>::printTreeInMid(BinaryNode<T>* t) const
{
if (t)
{
printTreeInPrev(t->left);
cout << t->element;
printTreeInPrev(t->right);
}
}
//后序打印
template <class T>
void BinarySearchTree<T>::printTreeInPost(BinaryNode<T>* t) const
{
if (t)
{
printTreeInPost(t->left);
printTreeInPost(t->right);
cout << t->element;
}
}
```
測(cè)試代碼
===
```C++
#include "BinarySearchTree.h"
int main()
{
BinarySearchTree<int> binaryTree;
binaryTree.insert(5);
binaryTree.insert(1);
binaryTree.insert(2);
binaryTree.insert(3);
binaryTree.insert(6);
binaryTree.insert(8);
//測(cè)試前中后序打印
cout <<endl<<"前序:"<<endl;
binaryTree.printTree(ORDER_MODE_PREV);
cout <<endl<<"中序:"<<endl;
binaryTree.printTree(ORDER_MODE_MID);
cout <<endl<<"后序:"<<endl;
binaryTree.printTree(ORDER_MODE_POST);
cout <<endl;
//測(cè)試基本操作
bool b = binaryTree.contains(1);
cout<< "是否存在1:"<<b<<endl;
int x = binaryTree.findMin();
cout << "最小值為:"<< x <<endl;
x = binaryTree.findMax();
cout << "最大值為:"<< x <<endl;
binaryTree.remove(2);
cout << "移除元素2之后"<<endl;
//測(cè)試前中后序打印
cout <<endl<<"前序:"<<endl;
binaryTree.printTree(ORDER_MODE_PREV);
cout <<endl<<"中序:"<<endl;
binaryTree.printTree(ORDER_MODE_MID);
cout <<endl<<"后序:"<<endl;
binaryTree.printTree(ORDER_MODE_POST);
cout <<endl;
return 0;
}
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)靜態(tài)鏈表的方法
分享一段代碼,一個(gè)靜態(tài)鏈表的C語(yǔ)言實(shí)現(xiàn),其中包含著一種簡(jiǎn)單的內(nèi)存管理策略:固定大小的鏈?zhǔn)焦芾怼?/div> 2013-03-03Qt圖形圖像開發(fā)曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例
這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例,需要的朋友可以參考下2020-03-03VScode配置C++運(yùn)行環(huán)境的完整步驟
這篇文章主要給大家介紹了關(guān)于VScode配置C++運(yùn)行環(huán)境的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01最新評(píng)論