AVL树增删查找

  

<李>

<李>


# pragma 一次      # include   using  namespace 性传播疾病;      template   struct  AVLTreeNode   {   AVLTreeNode *, _left;   AVLTreeNode *, _right;   AVLTreeNode *, _parent;   K  _key;   V  _value;   int  _bf;   AVLTreeNode (const  K&,钥匙,,const  V&,值)   :_left(空)   ,_right(空)   ,_parent(空)   ,_key(关键)   ,_value(值)   ,_bf (0)   {}   };      template   class  AVLTree   {   typedef  AVLTreeNode,节点;   公众:   AVLTree ()   :_root(空)   {}      ~ AVLTree ()   {}      bool 插入(const  K&,,, const  V&,值)   {   if  (_root ==, NULL)   {   时间=_root  new 节点(键,值);   return 真实;   }   节点*,cur =, _root;   节点*,parent =,空;   while (坏蛋)   {   if  (cur→_key  & lt;,键)   {   parent =,坏蛋;   时间=cur  cur→_right;   }   else  if  (cur→_key>键)   {   parent =,坏蛋;   时间=cur  cur→_left;   }   其他的   {   cout  & lt; & lt;,“该节点已经存在”,& lt; & lt;, endl;   return 假;   }   }   时间=cur  new 节点(键,值);   if (父→_key  & lt;,键)   {   父母→_right =,坏蛋;   时间=cur→_parent 家长;   }   其他的   {   父母→_left =,坏蛋;   时间=cur→_parent 家长;   }//更新平衡因子      while (父)   {   if  (cur ==,父→_right)   + +父母→_bf;   else  if  (cur ==,父→_left)   ——父母→_bf;   if (父→_bf ==, 0)   打破;   else  if (父→_bf ==, 1, | |,父→_bf ==, 1)   {   时间=cur 家长;   时间=parent  cur→_parent;   }   else //平衡因子为2或2时的情况   {   if (父→_bf ==, 2)   {   if  (cur→_bf ==, 1)   {,,//左旋转   RotateL(父);   }   else  if  (cur→_bf==1)   {   RotateRL(父);   }   }   其他的   {   if  (cur→_bf ==, 1)   {//右旋转   旋转(父);   }   else  if  (cur→_bf ==, 1)   {   RotateLR(父);   }   }   打破;   }   }   return 真实;   }      节点*,找到(const  K&,键)   {   if  (_root ==, NULL)   return 零;   节点*,cur =, _root;   while (坏蛋)   {   if  (cur→_key  & lt;,键)   {   时间=cur  cur→_right;   }   else  if  (cur→_key>键)   {   时间=cur  cur→_left;   }   其他的   {   cout  & lt; & lt;,“找到该数”,& lt; & lt;, endl;   return ,坏蛋;   }   }   return 零;   }      bool 删除(const  K&,键)   {   if  (_root ==, NULL)   return 假;   节点*,cur =, _root;   节点*,parent =,空;   while (坏蛋)   {   if  (cur→_key  & lt;,键)   {   parent =,坏蛋;   时间=cur  cur→_right;   }   else  if  (cur→_key>键)   {   parent =,坏蛋;   时间=cur  cur→_left;   }   其他的   {   if  (cur→_left ==, NULL ,,,坏蛋→_right ==, NULL)   {//1。左右都为空   if  (parent ==, NULL)   时间=_root 零;//若只有一个节点   其他的   {   if (父→_left ==, cur)   父母→_bf + +;   其他的   父母→_bf——;   }   delete ,坏蛋;   时间=cur 零;   }   else  if  (cur→_left&,坏蛋→_right)   {//2。左右都不为空   节点*,RightMin =,坏蛋→_right;   while  (RightMin→_left)   {   时间=parent  RightMin;   时间=RightMin  RightMin→_left;   }   坏蛋→_key =, RightMin→_key;//采用替换法删除   坏蛋→_value =, RightMin→_value;   if (父→_left ==, RightMin)   {   父母→_bf + +;   时间=父→_left  RightMin→_right;   }   其他的   {   父母→_bf——;   时间=父→_right  RightMin→_right;   }   delete  RightMin;   时间=RightMin 零;   }   其他的   {//3。左为空或右为空   if  (cur→_left)   {//1)。右为空   if  (parent ==, NULL)   {//只有两个节点,且为左孩子   时间=_root  cur→_left;   时间=_root→_bf  0;   }   其他的   {   if (父→_left ==, cur)   {   父母→_left =,坏蛋→_left;   父母→_bf + +;   }   其他的   {   父母→_right =,坏蛋→_left;   父母→_bf——;   }   }   }   其他的   {//2).cur的左为空   if  (parent ==, NULL)   {//只有两个节点,且为左孩子   时间=_root  cur→_right;   时间=_root→_bf  0;   }   其他的   {   if (父→_left ==, cur)   {   父母→_left =,坏蛋→_right;   父母→_bf + +;   }   其他的   {   父母→_right =,坏蛋→_right;   父母→_bf——;   }   }   }   delete ,坏蛋;   时间=cur 零;   }   打破;   }   }   while (父)   {//平衡因子为0或1,1对这个树的高度不会产生影响   if (父→_parent→_left ==,父母)   父母→_parent→_bf + +;   其他的   父母→_parent→_bf——;   if (父→_parent→_bf ==, 0)   return 真实;   else  if (父→_parent→_bf==1, | |,父→_parent→_bf==1)   {   时间=cur 家长;   时间=parent  cur→_parent;   }   其他的   {   if (父→_bf ==, 2)   {   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

AVL树增删查找