😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[Coding Interview University] 트리 : 이둠 및 κ΅¬ν˜„ λ³Έλ¬Έ

πŸ‘©‍πŸ’» 컴퓨터 ꡬ쑰/Computer Science

[Coding Interview University] 트리 : 이둠 및 κ΅¬ν˜„

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 7. 11. 01:40
728x90
λ°˜μ‘ν˜•

<λ³Έ λΈ”λ‘œκ·ΈλŠ” μ½”λ”©μΈν„°λ·°λŒ€ν•™ λ‹˜μ˜ Gitκ³Ό μ„œμ μ„ μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

 

🫧 트리

: ν•˜λ‚˜μ˜ 루트 μ½”λ“œλ₯Ό 가진닀

: 루트 λ…Έλ“œλŠ” 0개 μ΄μƒμ˜ μžμ‹ λ…Έλ“œλ₯Ό κ°–κ³  μžˆλ‹€

: νŠΈλ¦¬μ—λŠ” 사이클 μ‘΄μž¬ν•  수 μ—†λ‹€

: λ…Έλ“œλ“€μ€ νŠΉμ • μˆœμ„œλ‘œ λ‚˜μ—΄λ  μˆ˜λ„ 있고 그럴 수 없을 μˆ˜λ„ μžˆλ‹€

: 각 λ…Έλ“œλŠ” μ–΄λ–€ μžλ£Œν˜•μœΌλ‘œλ„ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€

λ…Έλ“œ(node) 트리의 κ΅¬μ„±μš”μ†Œμ— ν•΄λ‹Ήν•˜λŠ” A, B, C, D, E, F와 같은 μš”μ†Œ
κ°„μ„ (edge) λ…Έλ“œμ™€ λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” μ—°κ²°μ„ 
루트 λ…Έλ“œ(root node) 트리 κ΅¬μ‘°μ—μ„œ μ΅œμƒμœ„μ— μ‘΄μž¬ν•˜λŠ” A와 같은 λ…Έλ“œ
단말 λ…Έλ“œ(terminal node, leaf node) μ•„λž˜λ‘œ 또 λ‹€λ₯Έ λ…Έλ“œκ°€ μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•Šμ€ E, F, C, D와 같은 λ…Έλ“œ
λ‚΄λΆ€ λ…Έλ“œ(internal node),λΉ„ 단말 λ…Έλ“œ(non-terminal node) 단말 λ…Έλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  λ…Έλ“œλ‘œ A, B와 같은 λ…Έλ“œ
디그리(degree,차수) 각 λ…Έλ“œμ—μ„œ λ»—μ–΄λ‚˜μ˜¨ κ°€μ§€μ˜ 수 A=3, B=2
트리의 디그리 λ…Έλ“œλ“€μ˜ 디그리 μ€‘μ—μ„œ κ°€μž₯ λ§Žμ€ 수 Aκ°€ 3개의 디그리λ₯Ό 가지기 λ•Œλ¬Έμ— 트리의 λ””κ·Έλ¦¬λŠ” 3이닀.
λΆ€λͺ¨ λ…Έλ“œ(parent node) μ–΄λ–€ λ…Έλ“œμ— μ—°κ²°λœ 이전 레벨의 λ…Έλ“œ E,F의 λΆ€λͺ¨λ…Έλ“œλŠ” B
ν˜•μ œ λ…Έλ“œ(brother node) λ™μΌν•œ λΆ€λͺ¨λ₯Ό κ°–λŠ” λ…Έλ“œλ“€ E의 ν˜•μ œλ…Έλ“œλŠ” F

 

높이(height) 트리의 졜고 λ ˆλ²¨μ„ κ°€λ¦¬μΌœ '높이'라 ν•œλ‹€
레벨(level), 깊이 νŠΈλ¦¬μ—μ„œμ˜ 각 μΈ΅λ³„λ‘œ 숫자둜 λ§€κ²¨μ„œ 이λ₯Ό 트리의 '레벨'이라 ν•œλ‹€

 

🫧 BFS λ…ΈνŠΈ

  • level order (BFS, 큐λ₯Ό μ‚¬μš©ν•˜μ—¬)
  • μ‹œκ°„ λ³΅μž‘λ„: O(n)
  • 곡간 λ³΅μž‘λ„: 졜고: O(1) μ΅œμ•…: O(n/2)=O(n)

 

🫧 DFS λ…ΈνŠΈ

  • μ‹œκ°„ λ³΅μž‘λ„: O(n)
  • 곡간 λ³΅μž‘λ„: 졜고: O(log n) - ν‰κ· μ μœΌλ‘œ, 트리의 높이이닀. μ΅œμ•…: O(n)
  • μ€‘μœ„(inorder) (DFS: μ™Όμͺ½, μžμ‹ , 였λ₯Έμͺ½)
  • ν›„μœ„(postorder) (DFS: μ™Όμͺ½, 였λ₯Έμͺ½, μžμ‹ )
  • μ „μœ„(preorder) (DFS: μžμ‹ , μ™Όμͺ½, 였λ₯Έμͺ½)

 

🫧 λ…Έλ“œμ˜ μ„ μ–Έ

#define N 10

typedef struct tagNode {
	char data;
	int degree;
	struct tagNode child[N];
} Node;

 

🫧 트리의 μ„ μ–Έ

typedef struct tagTree {
	Node *root;
}Tree;

 

🫧 μƒμ„±μž

Node* newNode(char data) {
	Node* returnNode = (Node*)malloc(sizeof(Node));
	returnNode->data = data;
	returnNode->degree = 0;
	returnNode->child = NULL;
	return returnNode;
}

Tree* newTree() {
	Tree* returnTree = (Tree*)malloc(sizeof(Tree));
	returnTree->root = NULL;
	return returnTree;
}

 

🫧 트리

#include <stdio.h>
#include <stdlib.h>

typedef struct node //ꡬ쑰체 μ •μ˜
{
    int data;
    struct node *left;
    struct node *right;
}NODE;
  
/* newNode(): λ…Έλ“œμ— λ©”λͺ¨λ¦¬ ν• λ‹Ήν•˜κ³  μ΄ˆκΈ°ν™”*/
NODE* newNode(int data)
{
  //λ…Έλ“œμ— λ©”λͺ¨λ¦¬ ν• λ‹Ή 
  NODE* node = (NODE*)malloc(sizeof(NODE));
  
  //데이터 λ„£μŒ
  node->data = data;
  
  // μ™Όμͺ½, 였λ₯Έμͺ½ λ…Έλ“œλ₯Ό NULL둜 μ΄ˆκΈ°ν™”
  node->left = NULL;
  node->right = NULL;
  return(node);
}
  
  
int main()
{
  /*루트 λ…Έλ“œλ₯Ό λ§Œλ“ λ‹€*/
  NODE *root = newNode(1);  
  /* 루트 λ…Έλ“œλ₯Ό λ§Œλ“  μƒνƒœ
  
        1
      /   \\
     NULL  NULL  
  */
    
  
  root->left        = newNode(2);
  root->right       = newNode(3);
  /* 루트 λ…Έλ“œ1에 μ™Όμͺ½, 였λ₯Έμͺ½μ— 각각 2, 3μ΄λΌλŠ” μžμ‹ λ…Έλ“œ μΆ”κ°€ν•œ μƒνƒœ
           1
         /   \\
        2      3
     /    \\    /  \\
    NULL NULL NULL NULL
  */
  
  
  root->left->left  = newNode(4);
  /* 2의 μ™Όμͺ½ μžμ‹μœΌλ‘œ 4λ₯Ό μΆ”κ°€ν•œ μƒνƒœ
           1
       /       \\
      2          3
    /   \\       /  \\
   4    NULL  NULL  NULL
  /  \\
NULL NULL
*/
  
  getchar();
  return 0;
}
728x90
λ°˜μ‘ν˜•
Comments