青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我生如山

[導入]AVL Tree的一個簡單實現

#ifndef _ALV_TREE_H
#define _ALV_TREE_H
#define Max(a,b) (((a)>(b))?(a):(b))
#include <iostream>

template<class T>
class AVLTree
{
 struct _TreeNode;
 typedef struct _TreeNode TreeNode;
 struct _TreeNode
 {
  T data;
  int height;
  TreeNode* left;
  TreeNode* right;
 };

private:
 TreeNode *root;
public:
 AVLTree()
 {
  this->root=NULL;
 }

 ~AVLTree()
 {
  this->MakeEmpty(this->root);
 }

 int GeiHeight()
 {
  return this->GetHeightUtil(this->root);
 }

 void Insert(T data)
 {
  this->root=this->InsertUtil(this->root,data);
 }
 
 void Delete(T data)
 {
  this->root=this->DeleteUtil(this->root,data);
 }

 void Print()
 {
  /*if(root!=NULL)
  {
   std::cout<<"The root node is: "<<root->data<<std::endl;
  }*/
  for(int level=0;;level++)
  {
   if(this->PrintUtil(this->root,level)==0)
   {
    break;
   }
   std::cout<<std::endl;
  }
 }

private:
 TreeNode *InsertUtil(TreeNode *_root,T data)
 {
  if(_root==NULL)
  {
   _root=new TreeNode();
   _root->data=data;
   _root->left=0;
   _root->right=0;
   _root->height=0;
  }
  if(data>_root->data)
  {
   _root->right=this->InsertUtil(_root->right,data);
   if(GetHeightUtil(_root->right)-GetHeightUtil(_root->left)==2)
   {
    if(data>_root->right->data)
    {
     _root=this->SingleRotateWithRight(_root);
    }
    else
    {
     _root=this->DoubleRotateWithRight(_root);
    }
   }
  }
  else if(data<_root->data)
  {
   _root->left=this->InsertUtil(_root->left,data);
   if(GetHeightUtil(_root->left)-GetHeightUtil(_root->right)==2)
   {
    if(data<_root->left->data)
    {
     _root=this->SingleRotateWithLeft(_root);
    }
    else
    {
     _root=this->DoubleRotateWithLeft(_root);
    }
   }
  }
  _root->height=Max(GetHeightUtil(_root->left),GetHeightUtil(_root->right))+1;
  return _root;
 }

 TreeNode *DeleteUtil(TreeNode *_root,T data)
 {
  if(_root==NULL)
  {
   return _root;
  }
  else if(_root->data==data
   &&_root->left==NULL
   &&_root->right==NULL)
  {
   delete _root;
   return NULL;
  }
  else if(_root->data==data
   &&_root->left!=NULL
   &&_root->right==NULL)
  {
   TreeNode* tmpNode=_root->left;
   delete _root;
   tmpNode->height=this->RecalculateHeight(tmpNode);
   return tmpNode;
  }
  else if(_root->data==data
   &&_root->left==NULL
   &&_root->right!=NULL)
  {
   TreeNode *tmpNode=_root->right;
   delete _root;
   tmpNode->height=this->RecalculateHeight(tmpNode);
   return tmpNode;
  }
  else
  {
   if(data==_root->data)
   {
    TreeNode *tmpNode,*parentNode;
    tmpNode=_root->right->right;
    parentNode=_root->right;
    if(tmpNode!=NULL)
    {
     while(tmpNode->right!=NULL)
     {
      parentNode->height-=1;
      parentNode=tmpNode;
      tmpNode=tmpNode->right;
     }
     parentNode->right=NULL;
     _root->data=tmpNode->data;
     delete tmpNode;
    }
    else
    {
     _root=parentNode;
    }
    _root->height=this->RecalculateHeight(_root);
    //TreeNode *tmpNode=this->FindMax(_root->right);
    //_root->data=tmpNode->data;
    if(GetHeightUtil(_root->left)-GetHeightUtil(_root->right)==2)
    {
     if(_root->left->left!=NULL)
     {
      _root=this->SingleRotateWithLeft(_root);
     }
     else if(_root->left->right!=NULL)
     {
      _root=this->DoubleRotateWithLeft(_root);
     }
    }
   }
   else
   if(data>_root->data)
   {
    _root->right=this->DeleteUtil(_root->right,data);
    _root->height=this->RecalculateHeight(_root);
    if(GetHeightUtil(_root->left)-GetHeightUtil(_root->right)==2)
    {
     if(_root->left->left!=NULL)
     {
      _root=this->SingleRotateWithLeft(_root);
     }
     else if(_root->left->right!=NULL)
     {
      _root=this->DoubleRotateWithLeft(_root);
     }
    }
   }
   else
   {
    _root->left=this->DeleteUtil(_root->left,data);
    _root->height=this->RecalculateHeight(_root);
    if(GetHeightUtil(_root->right)-GetHeightUtil(_root->left)==2)
    {
     if(_root->right->right!=NULL)
     {
      _root=this->SingleRotateWithRight(_root);
     }
     else if(_root->right->left!=NULL)
     {
      _root=this->DoubleRotateWithRight(_root);
     }
    }
   }
  }
  //_root->height=this->RecalculateHeight(_root);
  return _root;
 }

 void MakeEmpty(TreeNode *_root)
 {
  if(_root==NULL)
  {
   return;
  }
  else
  {
   MakeEmpty(_root->left);
   MakeEmpty(_root->right);
   delete _root;
  }
 }

 int GetHeightUtil(TreeNode *_root)
 {
  /*if(_root==NULL|| (_root->left==NULL && _root->right==NULL))
  {
   return 0;
  }
  else
  {
   return 1+GetHeightUtil(_root->left)+GetHeightUtil(_root->right);
  }*/
  if(_root==NULL)
  {
   return -1;
  }
  else
  {
   return _root->height;
  }
 }

 int PrintUtil(TreeNode *node, int level)
 {
  if(node==NULL||level<0)
  {
   return 0;
  }
  else
  {
   if(level==0)
   {
    std::cout<<node->data<<" ";
    return 1;
   }
   return PrintUtil(node->left,level-1)+PrintUtil(node->right,level-1);
  }
 }

 TreeNode *SingleRotateWithLeft(TreeNode *node)
 {
  TreeNode *tmpNode=node->left;
  node->left=tmpNode->right;
  tmpNode->right=node;
  node->height=Max(GetHeightUtil(node->left),GetHeightUtil(node->right))+1;
  tmpNode->height=Max(GetHeightUtil(tmpNode->left),GetHeightUtil(tmpNode->right))+1;
  return tmpNode;
 }

 TreeNode*SingleRotateWithRight(TreeNode *node)
 {
  TreeNode *tmpNode=node->right;
  node->right=tmpNode->left;
  tmpNode->left=node;
  node->height=Max(GetHeightUtil(node->left),GetHeightUtil(node->right))+1;
  tmpNode->height=Max(GetHeightUtil(tmpNode->left),GetHeightUtil(tmpNode->right))+1;
  return tmpNode;
 }

 TreeNode* DoubleRotateWithLeft(TreeNode *node)
 {
  node->left=this->SingleRotateWithRight(node->left);
  return this->SingleRotateWithLeft(node);
 }

 TreeNode* DoubleRotateWithRight(TreeNode *node)
 {
  node->right=this->SingleRotateWithLeft(node->right);
  return this->SingleRotateWithRight(node);
 }

 TreeNode* FindMax(TreeNode *node)
 {
  //T maxData;
  while(node!=NULL&&node->right!=NULL)
  {
   node=node->right;
  }
  //maxData=node->data;
  return node;
 }

 int RecalculateHeight(TreeNode *node)
 {
  if(node==NULL)
  {
   return -1;
  }
  else
  {
   node->height=Max(RecalculateHeight(node->left),RecalculateHeight(node->right))+1;
   return node->height;
  }
 }
};

#endif



若我 2008-09-28 17:30 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/09/28/62997.html

posted on 2008-09-28 17:30 悟山 閱讀(140) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            另类国产ts人妖高潮视频| 久久久99爱| 亚洲欧美三级伦理| 国产精品久久久久久久午夜片| 激情久久久久久| 亚洲高清在线播放| 亚洲美女中文字幕| 亚洲欧美另类久久久精品2019| 亚洲欧美日本精品| 久久免费少妇高潮久久精品99| 牛夜精品久久久久久久99黑人| 欧美成人影音| 日韩视频免费观看| 性欧美大战久久久久久久免费观看 | 欧美色123| 国产精品一区久久久| 激情久久影院| 国产精品99久久久久久有的能看 | 中文有码久久| 久久激情网站| 亚洲精品久久久久久下一站| 亚洲天堂av综合网| 久久影视精品| 国产精品久久婷婷六月丁香| 亚洲成人资源网| 亚洲欧美在线播放| 欧美韩国日本一区| 欧美一级成年大片在线观看| 欧美国产日韩xxxxx| 国产女精品视频网站免费| 亚洲乱码国产乱码精品精天堂| 欧美中文在线视频| 亚洲精品在线看| 久久综合久久久| 国产精品永久| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲欧美综合网| 欧美精品久久99久久在免费线| 韩国成人理伦片免费播放| 亚洲一区二区黄| 亚洲国产成人高清精品| 久久精品天堂| 国产亚洲精品v| 欧美在线3区| 亚洲视频专区在线| 欧美日韩视频免费播放| 亚洲三级免费| 欧美激情中文字幕乱码免费| 久久精品九九| 极品日韩久久| 久久蜜桃资源一区二区老牛| 午夜精品一区二区在线观看| 国产精品你懂的在线| 一区二区久久久久| 亚洲福利视频一区| 国模吧视频一区| 欧美一区二区三区免费视| 亚洲久久一区二区| 欧美日韩国产成人在线91| 亚洲茄子视频| 亚洲日本乱码在线观看| 欧美精品在线视频| 一区二区三区精密机械公司| 亚洲区一区二区三区| 牛牛影视久久网| 亚洲另类视频| 99热在线精品观看| 国产精品视频999| 久久激情五月丁香伊人| 久久国产精品久久精品国产| 国产亚洲视频在线| 欧美成人精品不卡视频在线观看| 久久人人精品| 亚洲免费av片| 亚洲视频精品在线| 国产真实乱子伦精品视频| 免费久久99精品国产自在现线| 久久亚洲国产精品日日av夜夜| 亚洲国产91精品在线观看| 亚洲国产精品久久久久| 欧美日韩国产美女| 欧美在线精品一区| 米奇777在线欧美播放| 这里只有精品丝袜| 午夜在线一区| 亚洲精品一区在线观看香蕉| 一本大道av伊人久久综合| 国产欧美日韩视频一区二区三区 | 久热精品在线视频| 亚洲精选大片| 亚洲免费在线| 亚洲欧洲精品一区| 亚洲午夜激情免费视频| 国产一区二区三区视频在线观看| 欧美成人中文| 国产精品夜夜夜| 欧美激情在线| 国产日韩欧美日韩| 亚洲经典自拍| 国产综合网站| 99日韩精品| 亚洲观看高清完整版在线观看| 一卡二卡3卡四卡高清精品视频| 国产在线播精品第三| 日韩视频二区| 亚洲高清久久| 午夜精品久久久久久久久| 99国产精品国产精品毛片| 久久精品国产综合精品| 午夜精品久久一牛影视| 欧美大片一区| 久久只精品国产| 国产精品毛片a∨一区二区三区|国 | 亚洲精品免费网站| 午夜久久福利| 宅男噜噜噜66国产日韩在线观看| 久久久久久成人| 性做久久久久久久久| 欧美日韩在线免费| 欧美黄色免费网站| 在线观看国产日韩| 久久aⅴ国产欧美74aaa| 欧美一区二区精美| 国产精品a久久久久久| 亚洲国产成人不卡| 亚洲国产导航| 久久综合伊人77777麻豆| 久久久久久9999| 国产综合自拍| 久久精品国产欧美激情| 久久成人在线| 国产亚洲欧美日韩精品| 亚洲一区在线免费观看| 亚洲综合第一| 国产精品视频专区| 欧美一区二区免费观在线| 久久九九99| 在线观看欧美日韩| 久久久国产一区二区三区| 久久久噜噜噜久噜久久 | 亚洲激情影院| 亚洲三级免费观看| 欧美精品啪啪| 日韩午夜剧场| 午夜激情一区| 国内精品久久久久久久影视蜜臀 | 国产欧美精品一区二区色综合| 亚洲视频高清| 久久不射网站| 狠狠干成人综合网| 久久综合久久久久88| 亚洲国内精品在线| 亚洲一区二区不卡免费| 国产精品你懂的在线| 欧美一区二粉嫩精品国产一线天| 久久精品视频99| 91久久国产综合久久91精品网站| 欧美va亚洲va香蕉在线| 亚洲精一区二区三区| 香蕉av777xxx色综合一区| 国产综合一区二区| 欧美激情国产精品| 亚洲欧美国产一区二区三区| 久久一区二区三区四区五区| 亚洲欧洲综合另类在线| 国产精品久久久一本精品| 欧美自拍偷拍午夜视频| 亚洲激情国产| 久久精品1区| 亚洲另类视频| 国产亚洲精品久久久| 欧美激情精品久久久久久黑人| 一区二区久久久久久| 老色鬼精品视频在线观看播放 | 在线综合视频| 久久久久久久久久久久久久一区| 蜜乳av另类精品一区二区| 亚洲精品欧美日韩专区| 欧美性大战久久久久久久| 久久aⅴ国产欧美74aaa| 91久久综合| 久久久国产一区二区| 99国产精品99久久久久久| 国产亚洲精品成人av久久ww| 欧美高清自拍一区| 午夜在线一区| 99天天综合性| 欧美激情网友自拍| 久久九九99| 午夜在线a亚洲v天堂网2018| 亚洲精品美女在线观看| 极品尤物av久久免费看| 国产精品久久毛片a| 欧美激情欧美激情在线五月| 久久爱另类一区二区小说| 一本色道久久综合精品竹菊 | 国产欧美日韩中文字幕在线| 欧美99久久| 久久亚洲私人国产精品va媚药 | 欧美精品在线免费|