您的位置:首页 > 其它

查找

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;
}
};



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: