最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

二叉搜索樹(shù)源碼分享

 更新時(shí)間:2014年04月08日 10:52:56   作者:  
這篇文章主要介紹了二叉搜索樹(shù)源碼,需要的朋友可以參考下

復(fù)制代碼 代碼如下:

#include <iostream>
using namespace std;

//枚舉類,前中后三種遍歷方式
enum ORDER_MODE
{
 ORDER_MODE_PREV = 0,
 ORDER_MODE_MID,
 ORDER_MODE_POST
};

//樹(shù)節(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;
}

//使用另一棵二叉搜索樹(shù)的構(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;
}

// 尋找樹(shù)中的最小值
template <class T>
const T& BinarySearchTree<T>::findMin() const
{
 return findMin(m_root)->element;
}

//遞歸搜索樹(shù)中最小值
template <class T>
BinaryNode<T>* BinarySearchTree<T>::findMin( BinaryNode<T>* t) const
{
 //二叉樹(shù)的一個(gè)特點(diǎn)就是左子葉的值比根節(jié)點(diǎn)小, 右子葉的比根節(jié)點(diǎn)的大
 if (!t)
  return NULL;
 if (t->left == NULL)
  return t;
 else
  return findMin(t->left);
}

// 尋找樹(shù)中最大值
template <class T>
const T& BinarySearchTree<T>::findMax() const
{
 return findMax(m_root)->element;
}

//遞歸尋找樹(shù)中最大值
template <class T>
BinaryNode<T>* BinarySearchTree<T>::findMax( BinaryNode<T>* t) const
{
 //二叉樹(shù)的一個(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;
  }
 }
}

//清空二叉樹(shù)
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;
}


// 打印二叉搜索樹(shù)
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ǔ)言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán)

    C語(yǔ)言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++ opencv ffmpeg圖片序列化實(shí)現(xiàn)代碼解析

    C++ opencv ffmpeg圖片序列化實(shí)現(xiàn)代碼解析

    這篇文章主要介紹了C++ opencv ffmpeg圖片序列化實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 一篇文章帶你了解C語(yǔ)言的文件操作

    一篇文章帶你了解C語(yǔ)言的文件操作

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的文件操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • c語(yǔ)言的注釋定界符詳解

    c語(yǔ)言的注釋定界符詳解

    在本文里小編給大家分享的是關(guān)于c語(yǔ)言的注釋定界符知識(shí)點(diǎn)詳解,需要的朋友們可以跟著學(xué)習(xí)下。
    2020-02-02
  • c++中const的使用詳解

    c++中const的使用詳解

    本篇文章是對(duì)c++中的const的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c語(yǔ)言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(比較簡(jiǎn)單)

    c語(yǔ)言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(比較簡(jiǎn)單)

    這篇文章主要介紹了c語(yǔ)言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(比較簡(jiǎn)單),需要的朋友可以參考下
    2014-01-01
  • C++之string類對(duì)象的容量操作詳解

    C++之string類對(duì)象的容量操作詳解

    通過(guò)在網(wǎng)站上的資料搜集,得到了很多關(guān)于string類對(duì)象的容量操作,通過(guò)對(duì)這些資料的整理和加入一些自己的代碼,希望能夠給你帶來(lái)幫助
    2021-08-08
  • Qt槽函數(shù)會(huì)被執(zhí)行多次的問(wèn)題原因及解決方法

    Qt槽函數(shù)會(huì)被執(zhí)行多次的問(wèn)題原因及解決方法

    本文主要介紹了Qt槽函數(shù)會(huì)被執(zhí)行多次的問(wèn)題原因及解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 利用C++實(shí)現(xiàn)?然連接操作算法

    利用C++實(shí)現(xiàn)?然連接操作算法

    這篇文章主要介紹了利用C++實(shí)現(xiàn)?然連接操作算法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08

最新評(píng)論

广宗县| 綦江县| 银川市| 博罗县| 海兴县| 浏阳市| 天峨县| 基隆市| 广灵县| 南丰县| 襄城县| 木兰县| 宿迁市| 东丽区| 柳江县| 施甸县| 贵定县| 和田市| 当雄县| 湖州市| 集安市| 临城县| 兴宁市| 玉屏| 和田县| 宣恩县| 祁门县| 武邑县| 西乡县| 惠来县| 安徽省| 教育| 镇雄县| 峨边| 海阳市| 长岭县| 林州市| 称多县| 全椒县| 吐鲁番市| 家居|