⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bst.h

📁 一本全面剖析C++数据结构算法的书籍
💻 H
字号:
// bst.h// unbalanced binary search trees#ifndef BSTree_#define BSTree_#include "binary.h"#include "xcept.h"template<class E, class K>class BSTree : public BinaryTree<E> {   public:      bool Search(const K& k, E& e) const;      BSTree<E,K>& Insert(const E& e);      BSTree<E,K>& InsertVisit                   (const E& e, void(*visit)(E& u));      BSTree<E,K>& Delete(const K& k, E& e);      void Ascend() {InOutput();}};template<class E, class K>bool BSTree<E,K>::Search(const K& k, E &e) const{// Search for element that matches k.   // pointer p starts at the root and moves through   // the tree looking for an element with key k   BinaryTreeNode<E> *p = root;   while (p) // examine p->data      if (k < p->data) p = p->LeftChild;      else if (k > p->data) p = p->RightChild;           else {// found element                 e = p->data;                 return true;}   return false;}template<class E, class K>BSTree<E,K>& BSTree<E,K>::Insert(const E& e){// Insert e if not duplicate.   BinaryTreeNode<E> *p = root,  // search pointer                     *pp = 0;    // parent of p   // find place to insert   while (p) {// examine p->data      pp = p;      // move p to a child      if (e < p->data) p = p->LeftChild;      else if (e > p->data) p = p->RightChild;           else throw BadInput(); // duplicate      }   // get a node for e and attach to pp   BinaryTreeNode<E> *r = new BinaryTreeNode<E> (e);   if (root) {// tree not empty      if (e < pp->data) pp->LeftChild = r;      else pp->RightChild = r;}   else // insertion into empty tree        root = r;   return *this;}template<class E, class K>BSTree<E,K>& BSTree<E,K>::InsertVisit               (const E& e, void(*visit)(E& u)){// Insert e if not duplicate. // Visit e if duplicate.   // search for a matching element   BinaryTreeNode<E> *p = root, // search pointer                     *pp = 0;   // parent of p   while (p) {// examine p->data      pp = p;      if (e < p->data) p = p->LeftChild;      else if (e > p->data) p = p->RightChild;           else {// duplicate                 visit(p->data);                 return *this;};      }   // not a duplicate   // get a node for e and attach to pp   BinaryTreeNode<E> *r = new BinaryTreeNode<E> (e);   if (root) {// tree not empty      if (e < pp->data) pp->LeftChild = r;      else pp->RightChild = r;}   else // insertion into empty tree        root = r;   return *this;}template<class E, class K>BSTree<E,K>& BSTree<E,K>::Delete(const K& k, E& e){// Delete element with key k and put it in e.   // set p to point to node with key k   BinaryTreeNode<E> *p = root, // search pointer                     *pp = 0;   // parent of p   while (p && p->data != k){// move to a child of p      pp = p;      if (k < p->data) p = p->LeftChild;      else p = p->RightChild;      }   if (!p) throw BadInput(); // no element with key k   e = p->data;  // save element to delete   // restructure tree   // handle case when p has two children   if (p->LeftChild && p->RightChild) {// two children      // convert to zero or one child case      // find largest element in left subtree of p      BinaryTreeNode<E> *s = p->LeftChild,                        *ps = p;  // parent of s      while (s->RightChild) {// move to larger element         ps = s;         s = s->RightChild;}      // move largest from s to p      p->data = s->data;      p = s;      pp = ps;}   // p has at most one child   // save child pointer in c   BinaryTreeNode<E> *c;   if (p->LeftChild) c = p->LeftChild;   else c = p->RightChild;   // delete p   if (p == root) root = c;   else {// is p left or right child of pp?         if (p == pp->LeftChild)              pp->LeftChild = c;         else pp->RightChild = c;}   delete p;   return *this;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -