?? cbaltree.cpp
字號:
#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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -