1. Tree 기본 개념들 ¶
- Node : 노드
- Root : 맨 꼭대기 노드
- Edge : 노드 노드를 는
- Degree : 노드 딸려는 Edge
- Parent : 부모 노드
- Child : 노드
- Level : 몇?
- Sibling : (같 벨) 노드
- Height : Maximum Level
2. Binary Tree ¶
- 0 - 2개
- , 른 구
- 깊 k 대 노드 = 2^k - 1
- 벨 i 대 노드 = 2^(i-1)
- n0 귀 노드 갯, n2를 Degree가 2 노드 갯라고 면 n0 = n2 + 1 라는 공 립다.
3. Binray Tree ¶
- 배
- 그냥 례대로 는다. 루, , 른 로.. 는 깐다.
- 근때는
- Left Child : * 2
- Right Child : * 2 + 1
- Parent : /2 -> 내림
- Left Child : * 2
- 그냥 례대로 는다. 루, , 른 로.. 는 깐다.
- Linked List
- 노드는 데 가리는 링, 른 가리는 링로 구된다.
- 노드는 데 가리는 링, 른 가리는 링로 구된다.
4. Binary Tree Traversal ¶
- PreOrder : Root -> Left Child -> Right Child : 러가 가 는 방
~cpp PreOrder(a) { if(a) { visit a Preorder(a->left) Preorder(a->right) } }
- InOrder : Left Child -> Root -> Right Child : 리게 가 방
~cpp InOrder(a) { if(a) { InOrder(a->left) visit a InOrder(a->right) } }
- PostOrder : Left Child -> Right Child -> Root
~cpp PostOrder(a) { if(a) { PostOrder(a->left) PostOrder(a->right) visit a } }
- LevelOrder : 벨 로 방문
~cpp AddQ(Root) while(1) { a = DeleteQ(); Visit a; if(!a) break; if(a->left) AddQ(a->left) if(a->right) AddQ(a->right) }
5. Binary Search Trees (리말로 리) ¶
- 반로 렬되 는 배 가 빠른 랑는 고리로 려 답다.(맞나?--;)
- 반 : θ(n)
- : θ(log2 n) - 2는 밑다. 는법 는?--;
- n 2048 된다고 면 반 2048 리는 반면 11밖 린다는 말
- but, 렬되 면 나무든 뭐든 됩다. 나단 말다. 꼬는데 무..--;
- 반 : θ(n)
- Binray Search Tree 까 당 Binary Tree 다.
- Keys in Left Subtree < Keys of Node
- Keys in Right Subtree > Keys of Node(고로 대로 렬되 단 말다.)
- Binray Search Tree 까 당 Binary Tree 다.
- 고리
- Search x => Compare with Root
- if x = Root's Key then 까 고리 끝
- else if x > Root's Key Root를 Right Subtree Root로 . 기부 검 다
- else if x < Root's Key Root를 Left Subtree의 Root로 셋팅. 거기서부터 검색 다시 시작
- if x = Root's Key then 까 고리 끝
- Search x => Compare with Root
7. Delete x( 복) ¶
- Search x
- 만 x가 leaf(맨 끝 노드) - 그냥 면 되 뭐..--;
- x Child가 1개 경 - 그 노드 고 그 들 다 로 린다. 고로 된다는 것다.(뭔가 ?--;)
- x Child가 2개 경 - 그 노드 Left Subtree 가 값 는다. 값 y라고 면 y는 른 Child가 다. y를 x리 갖다 놓고 기 다
- y가 Child 면 - 그냥 다.
- y가 Child 면 - 그 밑 노드들 단 로.. 고로
- y가 Child 면 - 그냥 다.
- 만 x가 leaf(맨 끝 노드) - 그냥 면 되 뭐..--;
8. Tree 관련된 몇가(Cross Reference 때 던 변. C++로는 나-.-) ¶
~cpp // 리 관 들 void init(Node** node,char* ch) // 기 { (*node)->pLeft = (*node)->pRight = NULL; // 른 NULL로 (*node)->Data = new char[strlen(ch) + 1]; // 문 길만 당 strcpy((*node)->Data,ch); // 노드 문 복 } void PrintandDelete(Node* root) // 맨 부 (Preorder가?) { if( root->pLeft ) Print( root->pLeft ); cout << root->Data << endl; if( root->pRight ) Print( root->pRight ); delete root; // 당된 노드 } int Add(Node** root,char* ch) { if(!(*root)) // 무것 때 { *root = new Node; // 당 init(root,ch); // 기 return 1; } else if(strcmp((*root)->Data,ch)>0) // 부모가 보다 면 가 return add(&((*root)->pLeft),ch); else if(strcmp((*root)->Data,ch)<0) // 부모가 보다 면 른 가 return add(&((*root)->pRight),ch); else if(strcmp((*root)->Data,ch)==0) // 같면 가 return 1; }