查找
2016-05-10 21:05
274 查看
二叉查找树又叫二叉排序树或者二叉搜索树;最优二叉查找树是只内外结点权值之和最小的二叉查找树。
//----------头文件---------- //二叉查找树 template<class T> class BSTNode { public: BSTNode<T> *llink; BSTNode<T> *rlink; T key; BSTNode(const T &item, BSTNode<T> *lptr = NULL, BSTNode<T> *rptr = NULL):key(item), llink(lptr), rlink(rptr){} }; template<class T> class BSTree { private: BSTNode<T> *root; T stop; public: BSTree(BSTNode<T> *t = NULL):root(t){} BSTNode<T> *Search_Insert(T k); void Delete(BSTNode<T> *q); void OptimalBST(int p[], int q[], int n); BSTNode<T> *GetRoot() {return root;} void SetRoot(BSTNode<T> *t) {root = t;} void CreatBSTree(T tostop); //create tree void InOrder(BSTNode<T> *t)const; //中序遍历并输出以结点t为根的子树 BSTNode<T> *Father(BSTNode<T> *t, BSTNode<T> *p); T GetStop() {return stop;} void SetStop(T tostop){stop = tostop;} }; 源文件: #include "BSTNode.h" template<class T> BSTNode<T> *BSTree<T>::Search_Insert(T k)//find return value, or return NULL { if (root == NULL) { root = new BSTNode<T> (k, NULL, NULL); return NULL; } BSTNode<T> *p = root; while(p != NULL) { if (k == p->key)return p; //find from left if (k < p->key) { if (p->llink == NULL)break; else p = p->llink; } //find from right else { if (p->rlink == NULL)break; else p = p->rlink; } } BSTNode<T> *q = new BSTNode<T> (k, NULL, NULL); //insert form left if (k < p->key) p->llink = q; else p->rlink = q; return NULL; }; template<class T> void BSTree<T>::Delete(BSTNode<T> *q) { if (root == NULL) return; BSTNode<T> *t = q; //删除结点q的没有右孩子 //用左子树替代q的位置 if (t->rlink == NULL) t= t->llink; else { BSTNode<T> *r = t->rlink; //删除结点q的右孩子不存在左孩子 //将q的右孩子r替代q的位置,将q的左子树接到r的左孩子结点处 if (r->llink == NULL) { r->llink = q->llink; t = r; } //删除结点q的右孩子存在左孩子 //将q的右子树分支不断找其左子树为空的值s,r为s的父节点 //用s取代q的位置,将s的右子树作为父节点r的左子树 else { BSTNode<T> *s = r->rlink; //寻找右子树分支的左节点后代为空的结点s while(s->llink != NULL) { r = s; s = s->llink; } //q的左子树分支作为s的左子树分支 s->llink = t->llink; //s的右子树作为父节点r的左子树分支 r->llink = s->rlink; //q的右子树分支接到s的右子树结点上 s->rlink = t->rlink; //用s取代q的位置 t = s; } } if (q == root) root = t; else { //完成接树的过程,将删除q的子树接到其父节点处 BSTNode<T> *f = Father(root, q); if (f->llink == q)f->llink = t; else f->rlink = t; } delete q; }; //最有二叉树的构造,p保存内节点权值,q保存外结点权值 //最有二叉查找树就是内节点+外结点权值最小的特殊二叉排序树 //(由于算法比较费时,一般只应用于静态树,不进行插入和删除操作) template<class T> void BSTree<T>::OptimalBST(int p[], int q[], int n) { int i; int j; int k; int c[n+1][n+1], w[n+1][n+1], r[n+1][n=1]; for (i = 0; i <= n; i++) { c[i][i] = 0; w[i][i] = q[i]; } for (int d = 1; d <= n; d ++) for (i = 0; i <= n-d; i ++) { j = i + d; w[i][j] = w[i][j-1] + p[j] + q[j]; min = c[i+1][j]; for (k = i+1; k <= j; k++) if (c[i][k-1]+c[k][j] < min) { min = c[i][k-1] + c[k][j]; m = k; } c[i][j] = w[i][j] + min; r[i][j] = m; } };
相关文章推荐
- mysql查询学习第一天,针对scott
- 感知哈希算法--python实现
- 关于有偿提供拼图响应式后台的通知
- 12、备份与恢复ing
- Ubuntu14.04及以后的版本强制安装ia32-libs
- JVM各种内存溢出是否产生dump
- ps stat
- 图像特效---滤镜晕影特效调节算法
- android drawable总结
- 标签中的data-属性有什么用
- MapReduce类型与格式
- OPENWRT 查看DHCP的IP地址
- c++作业5
- 1041
- 1010
- 关于Service的三种启动方式(一)
- 学习日记2
- Linux查看磁盘使用率
- 笔记9:Networklnterface 类
- MySQL常见问题和应用技巧