Week 8-2 : Binary Search Tree (종강) (추가:180814)
Tutoring/18-1 DS2018. 6. 8. 00:49
<180608>
<소스코드>
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <cstdio> struct Node { int data; struct Node *left, *right; Node(int data) : data(data), left(0), right(0) {} }; class bst { private: Node *root; public: bst() : root(0) {} void insert(int data) { if(!root) { root = new Node(data); return ; } Node *p = 0; Node *cur = root; while(cur) { p = cur; if(cur->data < data) cur = cur->right; else cur = cur->left; } if(p->data < data) p->right = new Node(data); else p->left = new Node(data); } Node* getRoot() { return root; } void display(Node *root) { if(!root) return ; display(root->left); printf("%d\n", root->data); display(root->right); } void remove(int data) { Node *p = 0; Node *cur = root; while(cur && cur->data != data) { p = cur; if(cur->data < data) cur = cur->right; else cur = cur->left; } if(!cur) return ; if(cur->left == NULL && cur->right == NULL) { if(p == NULL) root = NULL; else { if(p->left == cur) p->left = NULL; else p->right = NULL; } } else if(cur->left == NULL || cur->right == NULL) { Node *child = cur->left ? cur->left : cur->right; if(p == NULL) root = child; else { if(p->left == cur) p->left = child; else p->right = child; } } else { Node *sp = cur; Node *sc = cur->right; while(sc->left != NULL) { sp = sc; sc = sc->left; } if(sp->left == sc) { sp->left = sc->right; } else sp->right = sc->right; cur->data = sc->data; cur = sc; } delete cur; } }; int main() { bst *t = new bst(); t->insert(5); t->insert(1); t->insert(3); t->insert(2); t->insert(10); t->insert(9); t->insert(7); t->insert(8); t->display(t->getRoot()); puts(""); t->remove(2); t->display(t->getRoot()); puts(""); t->remove(1); t->display(t->getRoot()); puts(""); t->remove(9); t->display(t->getRoot()); puts(""); return 0; } | cs |
1) 데이터의 삽입 과정
18 7 26 31 3 12 9 27
2) 데이터 찾기.
3) 데이터의 삽입
4) 데이터의 삭제
4-1) 타겟 노드가 단말노드인 경우
4-2) 타겟 노드가 자식을 하나만 가지고 있는 경우
4-3) 타겟 노드가 두개의 자식을 가지고 있는 경우
>> 타겟의 오른쪽 자식이 왼쪽 서브트리를 가진경우 or not
5) 데이터 탐색의 시간 복잡도
'Tutoring > 18-1 DS' 카테고리의 다른 글
Week 8-1 : Binary Tree 2 (0) | 2018.06.05 |
---|---|
Week 7-2 : Tree, Binary Tree (0) | 2018.05.27 |
Week 7-1 : Stack, Queue by Linked List (0) | 2018.05.19 |
Week 6 : Maze(with stack) / Circular Queue (0) | 2018.05.16 |
Week 5-2 : infix to postfix, exp(postfix) (0) | 2018.05.08 |