- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
bool ExcludeCase4(int iDepth)
{
MyNodeType pN = mPath[iDepth];
if (pN != null)
if (pN.AuxField.bRed) return false;
MyNodeType pP = mPath[iDepth - 1];
if (!pP.AuxField.bRed) return false;
MyNodeType pS;
if (LeftSon(iDepth))
pS = pP.pRight;
else
pS = pP.pLeft;
if (pS == null)
{
pP.AuxField.bRed = false;
iDepthBad = -1;
return true;
}
if (pS.AuxField.bRed) return false;
MyNodeType pSL = pS.pLeft;
if (pSL != null)
if (pSL.AuxField.bRed) return false;
MyNodeType pSR = pS.pRight;
if (pSR != null)
if (pSR.AuxField.bRed) return false;
pS.AuxField.bRed = true;
pP.AuxField.bRed = false;
iDepthBad = -1;
return true;
// Дерево стало хорошим. Корректировать больше не надо.
}
bool ExcludeCase6(int iDepth)
{
MyNodeType pN, pP, pS;
bool bLeft, bRedP;
pN = mPath[iDepth];
if (pN != null)
if (pN.AuxField.bRed) return false;
pP = mPath[iDepth - 1];
bRedP = pP.AuxField.bRed;
bLeft = LeftSon(iDepth);
if (bLeft)
pS = pP.pRight;
else
pS = pP.pLeft;
if (pS == null) return false;
if (pS.AuxField.bRed) return false;
MyNodeType pSL, pSR, p2, p3;
pSL = pS.pLeft;
pSR = pS.pRight;
if (bLeft)
{
if (pSR == null || pSR != null && !pSR.AuxField.bRed)
{
if (pSL == null) return false;
if (!pSL.AuxField.bRed) return false;
// Сюда попали => это Случай 5.
p2 = pSL.pRight;
pSL.pRight = pS;
pS.pLeft = p2;
pSL.AuxField.bRed = false;
pS.AuxField.bRed = true;
pP.pRight = pSL;
pSR = pS;
pS = pSL;
}
else
if (!pSR.AuxField.bRed) return false;
// Сюда попали => это Случай 6.
,......}
кусочек красно-черного дерева, необходимый, но не достаточный
wvxvw 18.06.2014 23:48 # 0
bormand 19.06.2014 05:51 # 0
Но, емнип, нормальная реализация не настолько длинная, т.к. там повороты узлов выносят в отдельные функции, и все 6(?) случаев не рассматривают по-отдельности.
kegdan 19.06.2014 11:21 # 0
Простая задачка. Мы на 2 курсе делали на выбор красно-черное или АВЛ дерево. Я делал АВЛ, поэтому КЧ помню не очень
bormand 19.06.2014 12:15 # 0
А я пишу, что сложная? Она просто муторная и требующая много внимательности и хорошего покрытия тестами. Лишний раз не хочется такое писать. Благо есть std::map, который, емнип, через красно-черное дерево и запилен.
P.S. AVL вроде бы чуть проще реализуется.