레드블랙트리 증감연산자 / C++
2023. 3. 10. 00:01ㆍ개인공부/자료구조와 알고리즘
증가연산자의 경우에는 마지막 원소다음에는 end iterator를 반환하고 감소연산자의 경우에는 begin iterator를 감소하는 경우에는 assert 처리를 해주었다. 레드블랙트리에서의 삭제의 알고리즘이 복잡해서 더 공부하고 구현예정이다.
1
2
3
4
5
6
7
8
9
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
|
RedBlackTree::iterator& RedBlackTree::iterator::operator++()
{
Node* nPtr = this->node;
assert(nPtr);
Node* leaf = tree->Leaf;
// #1 오른쪽 자식이 있음
if (nPtr->RightChild != leaf)
{
nPtr = nPtr->RightChild;
while (nPtr->LeftChild != leaf)
{
nPtr = nPtr->LeftChild;
}
this->node = nPtr;
}
else // 부모의 오른쪽 자식이고 오른쪽 자식이 없음
{
while (true)
{
if (nPtr->Parent == nullptr)
{
this->node = nullptr;
break;
}
if (tree->IsLeftChild(nPtr))
{
nPtr = nPtr->Parent;
this->node = nPtr;
break;
}
nPtr = nPtr->Parent;
}
}
return *this;
}
RedBlackTree::iterator& RedBlackTree::iterator::operator--()
{
Node* nPtr = this->node;
Node* leaf = tree->Leaf;
// #0 end iterator 인 경우
if (nPtr == nullptr)
return tree->rbegin();
// #1 왼쪽자식
else if (nPtr->LeftChild != leaf)
{
nPtr = nPtr->LeftChild;
while (nPtr->RightChild != leaf)
{
nPtr = nPtr->RightChild;
}
this->node = nPtr;
}
else
{
while (true)
{
if (nPtr->Parent == nullptr)
assert(nullptr);
if (tree->IsRightChild(nPtr))
{
nPtr = nPtr->Parent;
this->node = nPtr;
break;
}
nPtr = nPtr->Parent;
}
}
return *this;
}
|
cs |
'개인공부 > 자료구조와 알고리즘' 카테고리의 다른 글
레드블랙트리 삭제 구현/ C++ (0) | 2023.03.11 |
---|---|
레드블랙트리 - 삭제 (0) | 2023.03.10 |
레드블랙트리 insert구현 / C++ (0) | 2023.03.09 |
레드블랙트리 (자가균형 이진탐색트리) (0) | 2023.03.08 |
STL 정렬 sort 함수 (0) | 2023.02.09 |