cbaltree.cpp

来自「平衡树基类.可以通过继承重载建立自己需要的平衡树结构」· C++ 代码 · 共 749 行 · 第 1/2 页

CPP
749
字号
#include "stdafx.h"
#include "CBalTree.h"
#include "assert.h"
#include "ExternVal.h"

BalTreeObj::BalTreeObj()
{ 
       BalNum=0;
       DeepNum=1;
       PLeftObj=0;
       PRightObj=0;
       PParentObj=0;
       PID=0;
};

char BalTreeObj::GetBalNum()
{ 
return BalNum;
};

char BalTreeObj::GetDeepNum()
{ 
return DeepNum;
};

char BalTreeObj::GetPIDNum()
{ 
return PID;
};

void BalTreeObj::ReBuild(BalTreeObj* const BTO,int UnBalID)
{  
  BalTreeObj* InsteadObj;
  BalTreeObj* InsteadObjANO;
  InsteadObj=0;
  InsteadObjANO=0;
  switch(UnBalID)
  {  
     case 1:                              //平衡树的第一种情况
      InsteadObj=BTO->PLeftObj;  
      if(BTO->PParentObj)
      {
		  if(BTO->PID>0)
		  {     
			  BTO->PParentObj->PRightObj=InsteadObj;
		  }
		  else
		  {   
			  BTO->PParentObj->PLeftObj=InsteadObj;
		  };     
      };
      InsteadObj->PParentObj=BTO->PParentObj;
         BTO->PLeftObj=InsteadObj->PRightObj;
      if(InsteadObj->PRightObj)
      {
       InsteadObj->PRightObj->PParentObj=BTO;
          InsteadObj->PRightObj->PID=-1;
      };
         InsteadObj->PRightObj=BTO;
         InsteadObj->PID=BTO->PID;
      BTO->PID=1;
      BTO->PParentObj=InsteadObj;
      BTO->DeepNum-=2;
      BTO->BalNum=0;
      InsteadObj->BalNum=0;
      break;
     case 2:
      InsteadObj=BTO->PLeftObj->PRightObj;   //新的主节点已经连接好,并且设置了上层节点的DEEPNUM和BALNUM
      if(BTO->PParentObj)
      {
       if(BTO->PID>0)
       {
        BTO->PParentObj->PRightObj=InsteadObj;
       }
       else
       {
        BTO->PParentObj->PLeftObj=InsteadObj;
       }
      };
      InsteadObj->PID=BTO->PID;
      InsteadObj->PParentObj=BTO->PParentObj;
      InsteadObjANO=BTO->PLeftObj;         //At4与ki+1新的父子关系确定
      InsteadObjANO->PRightObj=InsteadObj->PLeftObj;
      InsteadObj->PLeftObj->PParentObj=InsteadObjANO;
      InsteadObj->PLeftObj->PID=1;
      InsteadObjANO->DeepNum--;
      InsteadObjANO->BalNum=0;
      InsteadObjANO->PRightObj->PID=1;
      BTO->PLeftObj=InsteadObj->PRightObj; //Ki与At-13新的父子关系确定
      if(InsteadObj->PRightObj)
      {
       InsteadObj->PRightObj->PParentObj=BTO;
       InsteadObj->PRightObj->PID=-1;
      };
      BTO->BalNum=1;
      BTO->DeepNum-=2;
      InsteadObj->PLeftObj=InsteadObjANO;  //新的主节点与其他两节点的父子关系确定
      InsteadObj->PRightObj=BTO;
      InsteadObjANO->PParentObj=InsteadObj;
      BTO->PParentObj=InsteadObj;
      BTO->PID=1;
      InsteadObj->BalNum=0;
      InsteadObj->DeepNum++;
               break;
     case 3:
      InsteadObj=BTO->PLeftObj->PRightObj;   //新的主节点已经连接好,并且设置了上层节点的DEEPNUM和BALNUM
      if(BTO->PParentObj)
      {
       if(BTO->PID>0)
       {
        BTO->PParentObj->PRightObj=InsteadObj;
       }
       else
       {
        BTO->PParentObj->PLeftObj=InsteadObj;
       }
      };
      InsteadObj->PID=BTO->PID;
      InsteadObj->PParentObj=BTO->PParentObj;
      InsteadObjANO=BTO->PLeftObj;         //At-14与ki+1新的父子关系确定
      InsteadObjANO->PRightObj=InsteadObj->PLeftObj;
      if(InsteadObj->PLeftObj)
               {
       InsteadObj->PLeftObj->PParentObj=InsteadObjANO;
          InsteadObj->PLeftObj->PID=1;
      };
      InsteadObjANO->DeepNum--;
      InsteadObjANO->BalNum=-1;
      BTO->PLeftObj=InsteadObj->PRightObj; //Ki与At3新的父子关系确定
      InsteadObj->PRightObj->PParentObj=BTO;
      InsteadObj->PRightObj->PID=-1;
               BTO->BalNum=0;
      BTO->DeepNum-=2;
      InsteadObj->PLeftObj=InsteadObjANO; //新的主节点与其他两节点的父子关系确定
      InsteadObj->PRightObj=BTO;
      InsteadObjANO->PParentObj=InsteadObj;
      BTO->PParentObj=InsteadObj;
      BTO->PID=1;
      InsteadObj->BalNum=0;
      InsteadObj->DeepNum++;
               break;
     case 4:
      InsteadObj=BTO->PLeftObj->PRightObj;   //新的主节点已经连接好,并且设置了上层节点的DEEPNUM和BALNUM
      InsteadObjANO=BTO->PParentObj;
      if(InsteadObjANO)
      {
       if(BTO->PID>0)
       {
           InsteadObjANO->PRightObj=InsteadObj;
       }
       else
       {
        BTO->PParentObj->PLeftObj=InsteadObj;
       };
      };
      InsteadObj->PID=BTO->PID;
      InsteadObj->PParentObj=BTO->PParentObj;
      InsteadObjANO=BTO->PLeftObj;
	  if(InsteadObj->PRightObj)  
	  {
//		  if(!InsteadObj->PLeftObj)
//			  BTO->PushError("错误发生在Rebuild函数的case 8,原因是BALNUM实际不平衡");
		  BTO->PLeftObj=InsteadObj->PRightObj;
		  InsteadObj->PRightObj->PParentObj=BTO;
		  InsteadObj->PRightObj->PID=-1;
		  InsteadObjANO->PRightObj=InsteadObj->PLeftObj;
		  InsteadObj->PLeftObj->PParentObj=InsteadObjANO;
		  InsteadObj->PLeftObj->PID=1;
	  }
	  else
	  {
		  
		  InsteadObjANO->PRightObj=0;
		  BTO->PLeftObj=0;
	  };
      InsteadObj->PLeftObj=InsteadObjANO;
      InsteadObj->PRightObj=BTO;
      InsteadObj->DeepNum++;
      InsteadObj->BalNum=0;
      InsteadObjANO->BalNum=0;
      InsteadObjANO->DeepNum--;
      BTO->PParentObj=InsteadObj;
      InsteadObjANO->PParentObj=InsteadObj;
      BTO->BalNum=0;
      BTO->DeepNum-=2;
      BTO->PID=1;
      break;
     case 5:                              //平衡树的第一种情况
      InsteadObj=BTO->PRightObj;  
      if(BTO->PParentObj)
      {
		  if(BTO->PID>0)
		  {     
			  BTO->PParentObj->PRightObj=InsteadObj;
		  }
		  else
		  {   
			  BTO->PParentObj->PLeftObj=InsteadObj;
		  };
     
      };
      InsteadObj->PParentObj=BTO->PParentObj;
      BTO->PRightObj=InsteadObj->PLeftObj;
      if(InsteadObj->PLeftObj)
      {
          InsteadObj->PLeftObj->PParentObj=BTO;
          InsteadObj->PLeftObj->PID=1;
      };
          InsteadObj->PLeftObj=BTO;
          InsteadObj->PID=BTO->PID;
      BTO->PID=-1;
      BTO->PParentObj=InsteadObj;
      BTO->DeepNum-=2;
      BTO->BalNum=0;
      InsteadObj->BalNum=0;
      break;
     case 6:
      InsteadObj=BTO->PRightObj->PLeftObj;   //新的主节点已经连接好,并且设置了上层节点的DEEPNUM和BALNUM
      if(BTO->PParentObj)
      {
       if(BTO->PID>0)
       {
        BTO->PParentObj->PRightObj=InsteadObj;
       }
       else
       {
        BTO->PParentObj->PLeftObj=InsteadObj;
       }
      };
      InsteadObj->PID=BTO->PID;
      InsteadObj->PParentObj=BTO->PParentObj;
      InsteadObjANO=BTO->PRightObj;         //At4与ki+1新的父子关系确定
      InsteadObjANO->PLeftObj=InsteadObj->PRightObj;
      InsteadObj->PRightObj->PParentObj=InsteadObjANO;
      InsteadObj->PRightObj->PID=-1;
      InsteadObjANO->DeepNum--;
      InsteadObjANO->BalNum=0;
      InsteadObjANO->PLeftObj->PID=-1;
      BTO->PRightObj=InsteadObj->PLeftObj; //Ki与At-13新的父子关系确定
      if(InsteadObj->PLeftObj)
      {
       InsteadObj->PLeftObj->PParentObj=BTO;
       InsteadObj->PLeftObj->PID=1;
      };
      BTO->BalNum=-1;
      BTO->DeepNum-=2;
      InsteadObj->PRightObj=InsteadObjANO;  //新的主节点与其他两节点的父子关系确定
      InsteadObj->PLeftObj=BTO;
      InsteadObjANO->PParentObj=InsteadObj;
      BTO->PParentObj=InsteadObj;
      BTO->PID=-1;
      InsteadObj->BalNum=0;
      InsteadObj->DeepNum++;
               break;
     case 7:
      InsteadObj=BTO->PRightObj->PLeftObj;   //新的主节点已经连接好,并且设置了上层节点的DEEPNUM和BALNUM
      if(BTO->PParentObj)
      {
       if(BTO->PID>0)
       {
        BTO->PParentObj->PRightObj=InsteadObj;
       }
       else
       {
        BTO->PParentObj->PLeftObj=InsteadObj;
       }
      };
      InsteadObj->PID=BTO->PID;
      InsteadObj->PParentObj=BTO->PParentObj;
      InsteadObjANO=BTO->PRightObj;         //At-14与ki+1新的父子关系确定
      InsteadObjANO->PLeftObj=InsteadObj->PRightObj;
      if(InsteadObj->PRightObj)
               {
       InsteadObj->PRightObj->PParentObj=InsteadObjANO;
          InsteadObj->PRightObj->PID=-1;
      };
      InsteadObjANO->DeepNum--;
      InsteadObjANO->BalNum=1;
      BTO->PRightObj=InsteadObj->PLeftObj; //Ki与At3新的父子关系确定
      InsteadObj->PLeftObj->PParentObj=BTO;
      InsteadObj->PLeftObj->PID=1;
               BTO->BalNum=0;
      BTO->DeepNum-=2;
      InsteadObj->PRightObj=InsteadObjANO; //新的主节点与其他两节点的父子关系确定
      InsteadObj->PLeftObj=BTO;
      InsteadObjANO->PParentObj=InsteadObj;
      BTO->PParentObj=InsteadObj;
      BTO->PID=-1;
      InsteadObj->BalNum=0;
      InsteadObj->DeepNum++;
       break;
     case 8:
		 /*
      InsteadObj=BTO->PRightObj->PLeftObj;   //新的主节点已经连接好,并且设置了上层节点的DEEPNUM和BALNUM
      InsteadObjANO=BTO->PParentObj;
      if(InsteadObjANO)
      {
       if(BTO->PID>0)
       {
           InsteadObjANO->PRightObj=InsteadObj;
       }
       else
       {
        BTO->PParentObj->PLeftObj=InsteadObj;
       };
      };
      InsteadObj->PID=BTO->PID;
      InsteadObj->PParentObj=BTO->PParentObj;
      InsteadObjANO=BTO->PRightObj;
      InsteadObj->PRightObj=InsteadObjANO;
      InsteadObj->PLeftObj=BTO;
      InsteadObj->DeepNum++;
      InsteadObj->BalNum=0;
      InsteadObjANO->BalNum=0;
      InsteadObjANO->DeepNum--;
      InsteadObjANO->PLeftObj=0;
      BTO->PRightObj=0;
      BTO->PParentObj=InsteadObj;
      InsteadObjANO->PParentObj=InsteadObj;
      BTO->BalNum=0;
      BTO->DeepNum-=2;
      BTO->PID=-1;
	  */
		 InsteadObj=BTO->PRightObj->PLeftObj;   //新的主节点已经连接好,并且设置了上层节点的DEEPNUM和BALNUM
		 InsteadObjANO=BTO->PParentObj;
		 if(InsteadObjANO)
		 {
			 if(BTO->PID>0)
			 {
				 InsteadObjANO->PRightObj=InsteadObj;
			 }
			 else
			 {
				 BTO->PParentObj->PLeftObj=InsteadObj;
			 };
		 };
		 InsteadObj->PID=BTO->PID;
		 InsteadObj->PParentObj=BTO->PParentObj;
		 InsteadObjANO=BTO->PRightObj;
		 if(InsteadObj->PRightObj)  
		 {
			 InsteadObjANO->PLeftObj=InsteadObj->PRightObj;
			 InsteadObj->PRightObj->PParentObj=InsteadObjANO;
			 InsteadObj->PRightObj->PID=-1;
			 InsteadObj->PLeftObj->PParentObj=BTO;
			 BTO->PRightObj=InsteadObj->PLeftObj;
			 InsteadObj->PLeftObj->PID=1;
		 }
		 else
		 {
			 
			 InsteadObjANO->PLeftObj=0;
			 BTO->PRightObj=0;
		 };
		 InsteadObj->PRightObj=InsteadObjANO;
		 InsteadObj->PLeftObj=BTO;
		 InsteadObj->DeepNum++;
		 InsteadObj->BalNum=0;
		 InsteadObjANO->BalNum=0;
		 InsteadObjANO->DeepNum--;

		 BTO->PParentObj=InsteadObj;
		 InsteadObjANO->PParentObj=InsteadObj;
		 BTO->BalNum=0;
		 BTO->DeepNum-=2;
		 BTO->PID=-1;     
      break;
	 case 9:
		 InsteadObj=BTO->PLeftObj;
		 InsteadObjANO=BTO->PParentObj;
		 //将根节点与新的ROOT绑定父子关系
		 if(InsteadObjANO)
		 {
			 if(BTO->PID==-1)
				 InsteadObjANO->PLeftObj=InsteadObj;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?