二叉排序树的c++实现,查找,删除等
2016-05-27 16:35
441 查看
二叉排序树的c++实现
#pragma once template <typename T> struct BSTNode { T m_nValue; BSTNode *m_pLeft; BSTNode *m_pRight; }; template <typename T> class BST { public: BST(T r[],int n); void InsertBST(BSTNode<T> *&R, BSTNode<T> *s);//插入数据在BST,R根结点,插入结点s BSTNode<T> *Search(BSTNode<T> *r, T key); bool DeleteBST(BSTNode<T>*&R, T key);//删除key void Delete(BSTNode<T>*&R); BSTNode<T> * GetpRoot(); private: BSTNode <T> *root; }; template <typename T> void BST<T>::InsertBST(BSTNode<T> *&R, BSTNode<T> *s) { if (R == nullptr) R = s;//R为空,将s直接插入 else if (s->m_nValue < R->m_nValue) InsertBST(R->m_pLeft, s);//递归向左子树中插入 else InsertBST(R->m_pRight, s); } //构造BST的过程即是一个反复插入的过程 template <typename T> BST<T>::BST(T r[], int n) { root = nullptr; for (size_t i = 0; i < n; i++) { BSTNode<T> *s = new BSTNode<T>; s->m_nValue = r[i]; s->m_pLeft= nullptr; s->m_pRight = nullptr; InsertBST(root, s);//插入 } } template <typename T> BSTNode<T>* BST<T>::Search(BSTNode<T> *r, T key) { if (r == nullptr) return nullptr; if (key == r->m_nValue) return r; else if (r->m_nValue > key) return Search(r->m_pLeft, key); else return Search(r->m_pRight, key); } template <typename T> bool BST<T>::DeleteBST(BSTNode<T>*&R, T key) { if (R == nullptr) return false; else if (R->m_nValue == key) { Delete(R); return true; } else if (key < R->m_nValue) return DeleteBST(R->m_pLeft, key);//查找key值 else return DeleteBST(R->m_pRight, key); } //删除情况分为三种情况 //仔细理解 template <typename T> void BST<T>::Delete(BSTNode<T>*&R) { BSTNode<T>*q, *s; if (R->m_pLeft==nullptr)//如果其左子树为空 { q = R; R = R->m_pRight;//R的右子数赋给R delete q;//删除q,即以前的R } if (R->m_pRight==nullptr) { q = R; R = R->m_pLeft; delete q; } else//左右子数都在 { q = R; s = R->m_pLeft; //寻找最大值进行与根结点的替换 while (s->m_pRight!=nullptr) { q = s; s = s->m_pRight; } R->m_nValue = s->m_nValue;//将此最大值赋给要删除的节点 if (q != R)//即进行了while循环,改变q q->m_pRight = s->m_pLeft;//s是q的右孩子,s是没有右子数的 else R->m_pLeft = s->m_pLeft; delete s; } } //获得根指针 template <typename T> BSTNode<T> * BST<T> ::GetpRoot() { return root; }
相关文章推荐
- C++ this指针的理解
- 漫谈C++:良好的编程习惯与编程要点
- 常用的字符串和数字之间的转换函数
- c++ primer 读书笔记
- 自行编写strcpy()函数
- 【C语言】合并,排序两个链表
- C++学习随笔
- 如何利用c++编写不能被继承、但可以在类外定义对象的类
- 列出100个质数
- C++之常量(一)
- C语言 大小端 字节对齐
- C++单例模式getInstance()——设计模式(1)
- C++的一些简单示例(4)
- 图的邻接矩阵表示 DFS 和BFS C++实现
- hdu1166(线段数,节点更新)
- c语言文件输入输出函数小结
- c++知识总结
- error while loading shared libraries: libstdc++.so.6
- libc++abi.dylib handler threw exception
- CodeForces 614B Gena's Code