查找

 二叉查找树又叫二叉排序树或者二叉搜索树;最优二叉查找树是只内外结点权值之和最小的二叉查找树。


//----------头文件----------
//二叉查找树
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;  
  }
}; 
 
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值