cbaltree.cpp

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

CPP
749
字号
			 else
				 InsteadObjANO->PRightObj=InsteadObj;
		 }
		 InsteadObj->PParentObj=InsteadObjANO;
		 //设置好新的ROOT的各个参数
		 InsteadObj->PID=BTO->PID;
		 InsteadObj->BalNum=1;
		 InsteadObj->DeepNum++;
		 //将BTO与新ROOT的右树绑定关系,设置好BTO和ROOT右树的参数
		 BTO->PLeftObj=InsteadObj->PRightObj;
		 InsteadObj->PRightObj->PParentObj=BTO;
		 InsteadObj->PRightObj->PID=-1;
		 BTO->BalNum=-1;
		 BTO->DeepNum--;
		 BTO->PID=1;
		 //将BTO与新ROOT绑定关系
		 BTO->PParentObj=InsteadObj;
		 InsteadObj->PRightObj=BTO;
		 break;
	 case 10:
		 InsteadObj=BTO->PRightObj;
		 InsteadObjANO=BTO->PParentObj;
		 //将根节点与新的ROOT绑定父子关系
		 if(InsteadObjANO)
		 {
			 if(BTO->PID==-1)
				 InsteadObjANO->PLeftObj=InsteadObj;
			 else
				 InsteadObjANO->PRightObj=InsteadObj;
		 }
		 InsteadObj->PParentObj=InsteadObjANO;
		 //设置好新的ROOT的各个参数
		 InsteadObj->PID=BTO->PID;
		 InsteadObj->BalNum=-1;
		 InsteadObj->DeepNum++;
		 //将BTO与新ROOT的左树绑定关系,设置好BTO和ROOT右树的参数
		 BTO->PRightObj=InsteadObj->PLeftObj;
		 InsteadObj->PLeftObj->PParentObj=BTO;
		 InsteadObj->PLeftObj->PID=1;
		 BTO->BalNum=1;
		 BTO->DeepNum--;
		 BTO->PID=-1;
		 //将BTO与新ROOT绑定关系
		 BTO->PParentObj=InsteadObj;
		 InsteadObj->PLeftObj=BTO;
		 break;
     default:
      return;
  };
};
BOOL BalTreeObj::SetPoint(BalTreeObj* const BTO,const int i)    //插入一个节点,并计算新的平衡值
{ 
    if(BTO)
	{   
		if(!i)   //左节点
        {  
			if(BTO->PLeftObj)
				return FALSE;
			this->PParentObj=BTO;
			BTO->PLeftObj=this;
			this->PID=-1;
			BTO->RefreshBalNum(-1*DeepNum);
		}
		else
		{   
			if(BTO->PRightObj)
				return FALSE;
			this->PParentObj=BTO;
			BTO->PRightObj=this;
			this->PID=1;
			BTO->RefreshBalNum(DeepNum);
		};
		return TRUE;
	};
	return FALSE;
};

CString BalTreeObj::GetValueMsg()
{
	return _T("");
}

BalTreeObj* BalTreeObj::DeletePoint(BalTreeObj* BTO,BalTreeObj*& BTOInstead)
{
	BalTreeObj* MoveBTO=NULL;
	if(BTO->BalNum<=0)  //从左边取节点
	{
		while(BTO->PLeftObj)
		{
		    MoveBTO=BTO->PLeftObj;
			assert(MoveBTO);
    		while(MoveBTO->PRightObj)
			{
        		MoveBTO=MoveBTO->PRightObj;
			}
			if(BTOInstead==MoveBTO)
				BTOInstead=BTO;
			BTO->NodeDataChange(MoveBTO);
			BTO=MoveBTO;
		}
	}
    else
	{
		while(BTO->PLeftObj||BTO->PRightObj)
		{
			MoveBTO=BTO->PRightObj;
			assert(MoveBTO);
			while(MoveBTO->PLeftObj)
				MoveBTO=MoveBTO->PLeftObj;
			if(BTOInstead==MoveBTO)
				BTOInstead=BTO;
			BTO->NodeDataChange(MoveBTO);
			BTO=MoveBTO;
				
		}
	}
	BalTreeObj* pRoot =  NULL;
	if(BTO->PParentObj)
	{
		if(BTO->PID==-1)
			BTO->PParentObj->PLeftObj=NULL;
		else
			BTO->PParentObj->PRightObj=NULL;
		BTO->PParentObj->RefreshBalNum(BTO->DeepNum*BTO->PID,FALSE);
		pRoot = BTO->PParentObj->GetRoot();
		BTO->PParentObj=NULL;
	}
	else
		pRoot = NULL;
	BTO->DeleteObject();
	delete BTO;
	return pRoot;
}

BalTreeObj* BalTreeObj::GetRoot()
{
if(this->PParentObj)
  return this->PParentObj->GetRoot();
else
     return this;
};

void BalTreeObj::RefreshBalNum(const int i,BOOL IsAdd)
{
	int RealDN;
	RealDN=0;
	if(IsAdd)
	{
		if((BalNum*i)>=0)
			RealDN=abs(i);
		else
			if(((BalNum+i)*BalNum)<0)
				RealDN=((BalNum+i)>0?(BalNum+i):-1*(BalNum+i));
		DeepNum=DeepNum+RealDN;
		BalNum=BalNum+i;
	}
	else
	{	
		if(BalNum*i>0)
		{
			if((BalNum-i)*BalNum>=0)
				RealDN=abs(i);
			else
				RealDN=abs(BalNum);
		}
		BalNum=BalNum-i;
		DeepNum=DeepNum-RealDN;
	};
	BalTreeObj* pParent = this->PParentObj;
	SHORT THISPID = this->PID;
	SHORT MinRealDN = 0;
	if(BalNum*BalNum>=4)    //发现不平衡
	{
		if(BalNum==-2)
		{ 
			if(this->PLeftObj->BalNum==-1)
			{
				ReBuild(this,1);
				MinRealDN = 1;
			}
			else if(this->PLeftObj->BalNum==1)
			{
				if(this->PLeftObj->PRightObj->BalNum==1)
				{
					MinRealDN = 1;
					ReBuild(this,3);
				}
				else if(this->PLeftObj->PRightObj->BalNum==-1)
				{
					MinRealDN = 1;
					ReBuild(this,2);
				}
				else
				{				
					MinRealDN = 1;
					ReBuild(this,4);
				}
			}
			else if(this->PLeftObj->BalNum==0)
			{	
				ReBuild(this,9);  //新加的情况,只有删除的时候才会出现
			};
		}
		else
		{   
			if(this->PRightObj->BalNum==1)
			{   
				MinRealDN = 1;
				ReBuild(this,5);
			}
			else if(this->PRightObj->BalNum==-1)
			{
				if(this->PRightObj->PLeftObj->BalNum==-1)
				{
					MinRealDN = 1;
					ReBuild(this,7);
				}
				else if(this->PRightObj->PLeftObj->BalNum==1)
				{
					MinRealDN = 1;
					ReBuild(this,6);
				}
				else
				{
					MinRealDN = 1;
					ReBuild(this,8);
				};
			}
			else
			{
				ReBuild(this,10);  //新加的情况,只有删除的时候才会出现
			};
		};
		if(IsAdd)
		    return;
		else
		{
			RealDN = MinRealDN;
		}
	};
	if(RealDN&&pParent)
	{   
		if(THISPID==-1)
		{
			pParent->RefreshBalNum(-1*RealDN,IsAdd);
		}
		else
		{
			pParent->RefreshBalNum(RealDN,IsAdd);
		}
	};
};

BalTreeObj::~BalTreeObj()
{
	DeleteObject();
}

void BalTreeObj::DeleteTree(BalTreeObj* pTreeObj)
{
	if(pTreeObj)
	{
		if(pTreeObj->PLeftObj)
		{
			DeleteTree(pTreeObj->PLeftObj);
			pTreeObj->PLeftObj->DeleteObject();
			delete pTreeObj->PLeftObj;
		}
		if(pTreeObj->PRightObj)
		{
			DeleteTree(pTreeObj->PRightObj);
			pTreeObj->PRightObj->DeleteObject();
			delete pTreeObj->PRightObj;
		}
	};
	
}

void BalTreeObj::DeleteObject()
{
}

void BalTreeObj::NodeDataChange(BalTreeObj* BTO)
{
	
}

BOOL BalTreeObj::CheckTreeData(BalTreeObj* BTO)
{
	assert(BTO);
	if(BTO->BalNum!=BTO->GetRealBalNum(BTO)||BTO->DeepNum!=BTO->GetRealDeep(BTO))
	{
		CString ErrorStr;
		ErrorStr=_T("BalNum or DeepNum Error:");
		ErrorStr+=BTO->GetValueMsg();
		BTO->PushError(ErrorStr);
		return FALSE;
	}
	if(BTO->PParentObj)
	{
		if((BTO->PParentObj->PLeftObj==BTO&&BTO->PID!=-1)||(BTO->PParentObj->PRightObj==BTO&&BTO->PID!=1))
		{
			CString ErrorStr;
			ErrorStr=_T("PID Error:");
			ErrorStr+=BTO->GetValueMsg();
			BTO->PushError(ErrorStr);
			return FALSE;
		}
	}
	if(BTO->PLeftObj)
	{
		if(BTO->PLeftObj->PParentObj!=BTO)
		{
			CString ErrorStr;
			ErrorStr=_T("PARENT Error:");
			ErrorStr+=BTO->GetValueMsg();
			BTO->PushError(ErrorStr);
			return FALSE;
		}
		if(!CheckTreeData(BTO->PLeftObj))
			return FALSE;
	}
	if(!BTO->CheckData())
		return FALSE;
	if(BTO->PRightObj)
	{
		if(BTO->PRightObj->PParentObj!=BTO)
		{
			CString ErrorStr;
			ErrorStr=_T("PARENT Error:");
			ErrorStr+=BTO->GetValueMsg();
			BTO->PushError(ErrorStr);
			return FALSE;
		}
		if(!CheckTreeData(BTO->PRightObj))
			return FALSE;
	}
	return TRUE;
}

SHORT BalTreeObj::GetRealDeep(BalTreeObj* BTO)
{
	if(BTO)
	{
		SHORT D1 = GetRealDeep(BTO->PLeftObj);
		SHORT D2 = GetRealDeep(BTO->PRightObj);
		return 1+(D1>D2?D1:D2);
	}
	else
		return 0;
}

SHORT BalTreeObj::GetRealBalNum(BalTreeObj* BTO)
{
	assert(BTO);
	return GetRealDeep(BTO->PRightObj)-GetRealDeep(BTO->PLeftObj);
}

void BalTreeObj::PushError(CString strReport)
{
}

BOOL BalTreeObj::CheckData()
{
	return TRUE;
}

INT BalTreeObj::GetTreeNode(BalTreeObj* BTO)
{
	if(!BTO)
		return 0;
	else
		return (GetTreeNode(BTO->PLeftObj))+(GetTreeNode(BTO->PRightObj))+1;
}

⌨️ 快捷键说明

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