代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
二叉搜索树
作者:
请叫我汪海
/ 发布于
2014/4/8
/
448
#include <iostream> using namespace std; //枚举类,前中后三种遍历方式 enum ORDER_MODE { ORDER_MODE_PREV = 0, ORDER_MODE_MID, ORDER_MODE_POST }; //树节点的结构体 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; }; //构造方法 template <class T> BinarySearchTree<T>::BinarySearchTree() { m_root = NULL; } //使用另一棵二叉搜索树的构造函数 template <class T> BinarySearchTree<T>:: BinarySearchTree(const BinarySearchTree& rhs) { m_root = rhs.m_root; } //析构函数,释放内存 template <class T> BinarySearchTree<T>:: ~BinarySearchTree() { makeEmpty(); } // 判断x元素是否存在 template <class T> bool BinarySearchTree<T>::contains(const T& x) const { return contains(x, m_root); } //递归调用 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 { //二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大 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 { //二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大 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);//注意这个指针参数是引用 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++ #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); //测试前中后序打印 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; //测试基本操作 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; //测试前中后序打印 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; }
试试其它关键字
二叉搜索树
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
请叫我汪海
贡献的其它代码
(
16
)
.
打印路径下的所有目录和文件名并写入本地文件
.
导航栏
.
登录表单
.
树状结构图
.
弹出提示框
.
页面上移解决文本框被键盘弹出挡住的问题
.
修改PlaceHolder的默认颜色
.
多线程和结束后的更新UI操作
.
自带的日志模块logging的使用
.
插入排序
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3