二叉查找树
来源:互联网 发布:unity3d toon shader 编辑:程序博客网 时间:2024/06/16 17:58
使二叉树成为二叉查找树的性质是,对于树中的每个结点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项。
BinarySearchTree类模板接口
template <typename Comparable>class BinarySearchTree{ public: BinarySearchTree(); BinarySearchTree( const BinarySearchTree& rhs); ~BinarySearchTree(); const Comparable& findMin() const; const Comparable& findMax() const; bool contains(const Comparable& x) const; bool isEmpty() const; void printTree() const; void makeEmpty(); void insert(const Comparable& x); void remove(const Comparable& x); const BinarySearchTree& operator=(const BinarySearchTree& rhs); private: struct BinaryNode { Comparable element; BinaryNode *left; BinaryNode *right; BinaryNode(const Comparable& theElement, BinaryNode *lt, BinaryNode *rt): element(theElement), left(lt), right(rt){} }; BinaryNode *root; void insert(const Comparable& x, BinaryNode * & t) const; void remove(const Comparable& x, BianryNode * & t) const; BinaryNode * findMin(BinaryNode *t) const; BinaryNode * findMax(BinaryNode *t) const; bool contains(const Comparable &x, BinaryNode *t) const; void makeEmpty(BinaryNode * & t); void printTree(BinaryNode *t) const; BinaryNode * clone(BinaryNode *t) const;};
公有成员函数调用私有递归成员函数的示例
/** *Returns true if x is found in the tree */bool contains(const Comparable & x) const{ return contains(x, root);}/** *Insert x into the tree; duplicates are ignored */void insert(const Comparable& x){ insert(x, root);}/** *Remove x from the tree.Nothing is done if x is not found. */void remove(const Comparable& x){ remove(x, root);}
二叉查找树的contains操作
/** *Internal method to test if an item is in a subtree *x is an item to search for *t is the node that roots the suntree */bool contains(const Comparable& x, binaryNode *t) contant{ if(t == NULL) return false; else if(x < t->element) return contains(x, t->left); else if(t->element < x); return contains(x, t->right); else return true; //Match}
使用函数对象,不使用Comparable项示例,
template <typename Object, typename Comparator=less<Object> >class BinarySearchTree{ public: //Same methods, with Object replacing Comparable private: BinaryNode *root; Comparator isLessThan; //Same methods, with Object replacing Comparable /** *Internal method to test if an item is in a *subtree. x is item to search for. *t is the node that roots the subtree. */ bool contains(const Object& x, BinaryNode *t) const { if(t == NULL) return false; else if(isLessThan(x, t->element) ) return contains(x, t->left); else if(isLessThan(t->element, x) ) return contains(x, t->right); else return true; //Match } };
用递归编写的findMin
/** *Internal method to find the smallest item in a *subtree t. *Return node containing the smallest item. */BinaryNode * findMin(BinaryNode *t) const{ if(t == NULL) return NULL; if(t->left == NULL) return t; return findMin(t->left);}
用非递归实现findMax
/** *Internal method to find the largest item in a *subtree t. *Return node containing the largest item. */ BinaryNode * findMax(BinaryNode *t) const { if(t != NULL) while(t->right != NULL) t = t->right; return t; }
将元素插入到二叉查找树的例程
/** *Internal method to insert into a subtree t. *x is the item to insert. *t is the node that roots the subtree. *Set the new root of the subtree. */void insert(const Comparable& x, BinaryNode * & t){ if(t == NULL) t = new BinaryNode(x, NULL, NULL); else if(x < t->element) insert(x, t->left); else if(t->element < x) insert(x, t->right); else ; //Duplicate;do nothing}
二叉查找树的删除例程
在处理具有两个儿子结点的情况时,一般是用其右子树的最小的数据代替该结点的数据并递归地删除那个结点。右子树中的最小的结点不可能有左儿子。
/** *Internal method to remove from a subtree. *x is the item to remove. *t is the node that roots the subtree. *Set the new root of the subtree. */void remove(const Comparable& x, BinaryNode * & t){ if(t == NULL) return; //item not found;do nothing if(x < t->element) remove(x, t->left); else if(t->element < x) remove(x, t->right); else if(t->left != NULL && t->right != NULL) //Two children { t->element = findMin(t->right)->element; remove(t->element, t->right) } else //deleting operation { BinaryNode *oldNode = t; t = (t->left != NULL) ? t->left : t->right; delete oldNode; }}
析构函数和递归makeEmpty函数
/** *Destructor for the tree */~BinarySearchTree(){ makeEmpty();}/** *Internal method to make subtree empty. */void makeEmpty(BinaryNode * & t){ if(t != NULL) { makeEmpty(t->left); makeEmpty(t->right); delete t; } t = NULL;}
复制赋值操作符和递归的clone成员函数
/** *Deep copy */const BinarySearchTree & operator=(const BinarySearchTree &rhs){ if(this != &rhs) { makeEmpty(); root = clone(rhs.root); } return *this;}/** *Internal method to clone subtree */BinaryNode* clone(BinaryNode* t) const{ if(t == NULL) return NULL; return new BinaryNode(t->element, clone(t->left), clone(t->right));}
参考Mark Allen Weiss《数据结构与算法分析c++描述》第三版,仅供学习交流之用,转发请注明原出处。
阅读全文
1 0
- 查找--二叉查找树
- 二叉树、二叉查找树
- 二叉树 & 二叉查找树
- 【查找结构】二叉查找树
- 查找之二叉树查找
- 查找之二叉树查找
- 查找:二叉查找树总结
- 二叉树查找树...
- 二叉树查找树
- 查找--遍历二叉树
- 二叉查找树
- 二叉查找树实现
- 二叉查找树
- 动态二叉查找树
- 最优二叉查找树
- 二叉查找树
- 二叉查找树
- 平衡二叉查找树
- 好的视频编解码网址和博文地址
- 算法提高 种树
- mybatis之通过单例模式来管理SqlSessionFactory
- 为什么我要改用Kotlin
- 从数据库里查询数据展示到listview上的案例
- 二叉查找树
- 排序算法——java实现(1):冒泡排序算法
- 深度探索c++对象模型之三 --- Data语意学
- 《Using OpenRefine》翻译~1
- 浏览器劫持固定时间打开网页
- PBRT 学习:安装编译
- Python字符串前的'r'
- 刷清橙OJ--A1025.字符串对比
- 【Unity&UGUI】