博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

寻路

摄心为纲, 断惑为要, 常行惭愧, 常观己心.
   linfengfeiye.cublog.cn
关于作者  
姓名:秒振
职业:计算机
年龄:28
位置:
个性介绍:

我的分类  




伸展树实现
#include <iostream>
#include <string>
using namespace std;
template <class T>
struct BSTNode
{
BSTNode *left,*right;
T element;
BSTNode(BSTNode* x=0,BSTNode* y=0,T e=T())
{
left=x;
right=y;
element=e;
}
};
/////////////////////////////////////////////////////////////
//普通二叉树类
/////////////////////////////////////////////////////////////
template <class T>
class SPTree
{
public:
 SPTree(){root=NULL;}
 BSTNode<T>* get_root();
    bool is_digit(string x);
    BSTNode<T>* LRot(BSTNode<T>* node);//单左旋转
 BSTNode<T>* RRot(BSTNode<T>* node);//单右旋转
    BSTNode<T>* LLRot(BSTNode<T>* node);//左左双旋转
 BSTNode<T>* RRRot(BSTNode<T>* node);//右右双旋转
 BSTNode<T>* LRRot(BSTNode<T>* node);//左右双旋转
 BSTNode<T>* RLRot(BSTNode<T>* node);//右左双旋转
 BSTNode<T>* insert(BSTNode<T>* node,T x);
 
 void print_data(T& data,int level);         //输出二叉树
    void print_tree(BSTNode<T>* node,int level);
 BSTNode<T>* input(istream& in);               //输入二叉树
    void SPTree<T>::output(ostream& out);
 ~SPTree(){delete root;}
private:
 BSTNode<T>* root;
};
    template <class T>
    BSTNode<T>* SPTree<T>::LRot(BSTNode<T>* node)//单左旋转
 {
     /*
      p                   q
     / \                 / \
    q   R  --------->   A   p     
    /\                     / \                
   A  B                   B   R 
     */
     BSTNode<T>* temp=node->left;
  node->left=temp->right;
  temp->right=node;
     return temp;
 }
 template <class T>
 BSTNode<T>* SPTree<T>::RRot(BSTNode<T>* node)//单右旋转
 {
   /*
      p                   q
     / \                 / \
    q   R  <---------   A   p     
    /\                     / \                
   A  B                   B   R 
  */
     BSTNode<T>* temp=node->right;
  node->right=temp->left;
  temp->left=node;
     return temp;
 }
 template <class T>
    BSTNode<T>* SPTree<T>::LLRot(BSTNode<T>* node)//左左双旋转
 {
  /*
       p                   r
      / \                 / \
     q   R  --------->   A   q     
     /\                     / \                
    r  C                   B   p
   / \                        / \
  A   B                      C   R
  */
   BSTNode<T>* temp1=node->left;
   BSTNode<T>* temp2=temp1->left;
   temp1->left=temp2->right;
   node->left=temp1->right;
   temp2->right=temp1;
   temp1->right=node;
   return temp2;
 }
 template <class T>
 BSTNode<T>* SPTree<T>::RRRot(BSTNode<T>* node)//右右双旋转
 {
  /*
       p                   r
      / \                 / \
     q   R  <---------   A   q     
     /\                     / \                
    r  C                   B   p
   / \                        / \
  A   B                      C   R
  */
   BSTNode<T>* temp1=node->right;
   BSTNode<T>* temp2=temp1->right;
   temp1->right=temp2->left;
   node->right=temp1->left;
   temp2->left=temp1;
   temp1->left=node;
   return temp2;
 }
 template <class T>
 BSTNode<T>* SPTree<T>::LRRot(BSTNode<T>* node)//左右双旋转
 {
     /*
       p                    r
      / \                 /   \
     q   R  --------->   q     p     
     /\                 / \   / \                
    A  r               A   B C   R
      / \                       
     B   C                        
     */
   BSTNode<T>* temp1=node->left;
   BSTNode<T>* temp2=temp1->right;
   temp1->right=temp2->left;
   node->left=temp2->right;
   temp2->left=temp1;
   temp2->right=node;
   return temp2;
 }
 template <class T>
 BSTNode<T>* SPTree<T>::RLRot(BSTNode<T>* node)//右左双旋转
 {
     /*
       p                    r
      / \                 /   \
     R   q   -------->   p     q   
         /\             / \   / \                
        r  A           R   B C   A
       / \                             
      B   C                        
     */
   BSTNode<T>* temp1=node->right;
   BSTNode<T>* temp2=temp1->left;
   temp1->left=temp2->right;
   node->right=temp2->left;
   temp2->right=temp1;
   temp2->left=node;
   return temp2;
  }
 template <class T>
 BSTNode<T>* SPTree<T>::insert(BSTNode<T>* node,T x)
 {
 BSTNode<T>* r=NULL;
 BSTNode<T>* result=NULL;
     if(node==NULL)         //是新结点
  {
    result=new BSTNode<T>(0,0,x);
    return result;
  }
  else if(x<node->element)//插入左子树
  {
   r=node->left;
   if(r==NULL)           //插入
   {
          r=new BSTNode<T>(0,0,x);
    r->right=node;
    node->left=NULL;
    return r;
   }
   else if(x==r->element)//结点已经存在
   {
         result=LRot(node);                              //单旋转
   return result;
   }
   else if(x<r->element)//插入左结点的左子树
   {
    r->left=insert(r->left,x);
    r=LRot(r);                                   //双旋转 LL                              
    node->left=r;
   }
   else if(x>r->element)//插入左结点的右子树
   {
    r->right=insert(r->right,x);
    r=RRot(r);                                   //双旋转LR   
    node->left=r;
   }
          result=LRot(node);                     
         
  }
  else                     //插入右子树
  {
    r=node->right;
 if(r==NULL)               //插入
 {
  result=new BSTNode<T>(0,0,x);
  result->left=node;
  node->right=NULL;
  return result;
 }
 else if(x==r->element)    //结点已经存在
 {
     result=RRot(node);                                    //单旋转
  return result;
 }
 else if(x<r->element)     //插入右结点的左子树
 {
     r->left=insert(r->left,x);
  r=LRot(r);                                            //双旋转 RL
  node->right=r;                                       
 }
 else if(x>r->element)     //插入右结点的右子树
 {
     r->right=insert(r->right,x);
  r=RRot(r);                                            //双旋转 RR
  node->right=r;
 }
 result=RRot(node);
 }
  return result;
 }
 
 
    template <class T>
 void SPTree<T>::print_data(T& data,int level)
 {
    for(int i=0;i<level;i++)
    cout<<"  ";
 cout<<data<<endl;
 }
 template <class T>
 void SPTree<T>::print_tree(BSTNode<T>* node,int level)
 {
 if(node!=NULL)
 {
 if(node->right!=NULL)
    print_tree(node->right,level+1);
 print_data(node->element,level);
 if(node->left!=NULL)
 print_tree(node->left,level+1);
 }
 
 }
 template <class T>
 BSTNode<T>* SPTree<T>::get_root()
 {
  return root;
 }
   template <class T>
   bool SPTree<T>::is_digit(string x)
   {
 char* temp=(char*)calloc(20,sizeof(char));
 strcpy(temp,x.c_str());
 for(int i=0;i<x.size();i++)
 {
  char y=temp[i];
  if(y<'0'||y>'9')
   break;
  return true;
 } 
 return false;
   }
   template <class T>
   BSTNode<T>* SPTree<T>::input(istream& in)
 {
  string x;
  int e;
  while(true)
  {
   in>>x;
      if(is_digit(x))
   e=atoi(x.c_str());
   else
    break;
      root=insert(root,e);
  }
  return root;
 }
   template <class T>
   void SPTree<T>::output(ostream& out)
   {
   out<<"the tree contains is as follows"<<endl;
   print_tree(root,0);
   }
 
int main()
{
SPTree<int>* x=new SPTree<int>();
x->input(cin);
x->output(cout);
system("pause");
}

 发表于: 2008-06-05,修改于: 2008-06-05 16:43 已浏览170次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.15551

京ICP证041476号