当前位置:  编程技术>c/c++/嵌入式

二叉搜索树源码分享

    来源: 互联网  发布时间:2014-10-25

    本文导语:  代码如下:#include using namespace std; //枚举类,前中后三种遍历方式enum ORDER_MODE{ ORDER_MODE_PREV = 0, ORDER_MODE_MID, ORDER_MODE_POST}; //树节点的结构体template struct BinaryNode{ T    element; BinaryNode  *left; BinaryNode  *right;  BinaryNode(const T& ...

代码如下:

#include
using namespace std;

//枚举类,前中后三种遍历方式
enum ORDER_MODE
{
 ORDER_MODE_PREV = 0,
 ORDER_MODE_MID,
 ORDER_MODE_POST
};

//树节点的结构体
template
struct BinaryNode
{
 T    element;
 BinaryNode  *left;
 BinaryNode  *right;

 BinaryNode(const T& theElement,
  BinaryNode *lt,
  BinaryNode *rt):
 element(theElement),
  left(lt),
  right(rt)
 {

 }
};


template
class BinarySearchTree
{
private:

 BinaryNode   *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) ;
 void remove(const T& x, BinaryNode* &t) ;
 BinaryNode* findMin( BinaryNode* t) const;
 BinaryNode* findMax( BinaryNode* t) const;
 bool contains(const T& x, const BinaryNode* t) const;
 void makeEmpty(BinaryNode* &t);
 void printTreeInPrev(BinaryNode* t) const;
 void printTreeInMid(BinaryNode* t)const;
 void printTreeInPost(BinaryNode* t)const;
};

//构造方法
template
BinarySearchTree::BinarySearchTree()
{
 m_root = NULL;
}

//使用另一棵二叉搜索树的构造函数
template
BinarySearchTree:: BinarySearchTree(const BinarySearchTree& rhs)
{
 m_root = rhs.m_root;
}

//析构函数,释放内存
template
BinarySearchTree:: ~BinarySearchTree()
{
 makeEmpty();
}

// 判断x元素是否存在
template
bool  BinarySearchTree::contains(const T& x) const
{
 return contains(x, m_root);
}

//递归调用
template
bool BinarySearchTree::contains(const T& x, const BinaryNode* 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
const T& BinarySearchTree::findMin() const
{
 return findMin(m_root)->element;
}

//递归搜索树中最小值
template
BinaryNode* BinarySearchTree::findMin( BinaryNode* t) const
{
 //二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大
 if (!t)
  return NULL;
 if (t->left == NULL)
  return t;
 else
  return findMin(t->left);
}

// 寻找树中最大值
template
const T& BinarySearchTree::findMax() const
{
 return findMax(m_root)->element;
}

//递归寻找树中最大值
template
BinaryNode* BinarySearchTree::findMax( BinaryNode* t) const
{
 //二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大
 if (t != NULL)
  while (t->right != NULL)
   t = t->right;
 return t;
}

// 插入元素
template
void BinarySearchTree:: insert(const T& x)
{
 insert(x, m_root);
}

//递归插入
template
void BinarySearchTree::insert(const T& x, BinaryNode* &t)
{
 if (t == NULL)
  t = new BinaryNode(x, NULL, NULL);//注意这个指针参数是引用
 else if (x < t->element)
  insert(x, t->left);
 else if (x > t->element)
  insert(x, t->right);
 else
  ;//do nothing
}


//移除元素
template
void BinarySearchTree::remove(const T& x)
{
 return remove(x, m_root);
}

//递归移除
template
void BinarySearchTree::remove(const T& x, BinaryNode* &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 *oldNode = t;
   t = (t->left != NULL) ? t->left : t->right;
   delete oldNode;
  }
 }
}

//清空二叉树
template
void  BinarySearchTree::makeEmpty()
{
 makeEmpty(m_root);
}

//递归清空
template
void  BinarySearchTree::makeEmpty(BinaryNode* &t)
{
 if (t)
 {
  makeEmpty(t->left);
  makeEmpty(t->right);
  delete t;
 }
 t = NULL;
}


// 打印二叉搜索树
template
void BinarySearchTree::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
void BinarySearchTree::printTreeInPrev(BinaryNode* t) const
{
 if (t)
 {
  cout element;
  printTreeInPrev(t->left);
  printTreeInPrev(t->right);
 }
}

//中序打印
template
void BinarySearchTree::printTreeInMid(BinaryNode* t) const
{
 if (t)
 {
  printTreeInPrev(t->left);
  cout element;
  printTreeInPrev(t->right);
 }
}

//后序打印
template
void BinarySearchTree::printTreeInPost(BinaryNode* t) const
{
 if (t)
 {
  printTreeInPost(t->left);
  printTreeInPost(t->right);
  cout element;
 }
}
```


测试代码
===
```C++
#include "BinarySearchTree.h"


int main()
{
 BinarySearchTree binaryTree;
 binaryTree.insert(5);
 binaryTree.insert(1);
 binaryTree.insert(2);
 binaryTree.insert(3);
 binaryTree.insert(6);
 binaryTree.insert(8);
 //测试前中后序打印
 cout


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux bash shell命令:grep文本搜索工具简介
  • VI搜索时怎样将复制的内容作为搜索的内容??
  • 通过docker search命令搜索可用docker镜像
  • 高分求救:如何在一个企业的自己的网站上设置搜索引擎,用来搜索本行业的信息,需要什么条件?
  • linux bash shell命令:文本搜索工具grep中用于egrep和 grep -E的元字符扩展集
  • 请问 如何修改hostname. 本站搜索未果,google搜索未果,看linux自带帮助未果.
  • linux bash shell命令:文本搜索工具Grep命令选项及实例
  • 列出该shell的搜索路径。如果搜索路径中不包括当前目录和
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • 怎样用jsp做一个简单的关键字全文搜索,只要搜索一个目录中的文件即可(全是.htm文件)
  • 跪求一个按指定日期搜索文件,并把搜索到的文件复制到自定义的目录下的shell程序
  • 我用java做的applet站内搜索程序,不能搜索中文,那位大虾能帮帮我?代码如下:
  • 请教点击开始-->搜索-->文件和文件夹-->搜索选项-->日期-->介于选择日期的那个框怎么实现的??
  • Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
  • 常见问题常见问题 搜索搜索 团队团队 个人资料个人资料 您没有新的站内信件您没有新的站内信件 注销 [ tnt_bomb ]注销 [ tnt_b
  • 网站的站内搜索是怎么实现的?怎么做?在网页的头元素中有一关键词元素,是不是就是给站内搜索用的?如果我在Sina中登记我的网站,那么是不是
  • android将搜索引擎设置为中国雅虎无法搜索问题解决方法
  • Google AJAX 搜索 API
  • 姓名搜索
  • 命令行的搜索工具 Surfraw
  • 开源搜索系统 Red-Piranha




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3