TIL(40) BST

codedotΒ·2021λ…„ 8μ›” 28일
0

Binary Search Tree ✍🏻

  • 효율적인 탐색을 μœ„ν•΄ 트리 ꡬ쑰가 가진 νŠΉμ§•μ— 따라 μ—¬λŸ¬ 가지 μ΄λ¦„μœΌλ‘œ λ‚˜λ‰œλ‹€.

μ΄μ§„νŠΈλ¦¬(Binary tree)

  • μžμ‹ λ…Έλ“œκ°€ μ΅œλŒ€ 두 개인 λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λœ 트리, 이진 탐색 νŠΈλ¦¬λŠ” λͺ¨λ“  μ™Όμͺ½ μžμ‹μ˜ 값이 λ£¨νŠΈλ‚˜ λΆ€λͺ¨λ³΄λ‹€ μž‘κ³ , λͺ¨λ“  였λ₯Έμͺ½ μžμ‹μ˜ 값이 λ£¨νŠΈλ‚˜ λΆ€λͺ¨λ³΄λ‹€ 큰 값을 κ°€μ§€λŠ” 것이 νŠΉμ§•

    • μ • 이진 트리(Full binary tree) : 각 λ…Έλ“œκ°€ 0개 ν˜Ήμ€ 2개의 μžμ‹ λ…Έλ“œλ₯Ό κ°–λŠ”λ‹€.

    • 포화 이진 트리(Perfect binary tree) : μ • 이진 νŠΈλ¦¬μ΄λ©΄μ„œ μ™„μ „ μ΄μ§„νŠΈλ¦¬μΈ 경우, 리프 λ…Έλ“œμ˜ 레벨이 λ™μΌν•˜κ³ , λͺ¨λ“  레벨이 가득 μ±„μ›Œμ Έ μžˆλŠ” 트리

    • μ™„μ „ 이진 트리(Complete binary tree) : λ§ˆμ§€λ§‰ λ ˆλ²¨μ„ μ œμ™Έν•œ λͺ¨λ“  λ…Έλ“œκ°€ 가득 μ°¨ μžˆμ–΄μ•Ό ν•˜κ³ , λ§ˆμ§€λ§‰ 레벨의 λ…Έλ“œλŠ” μ „λΆ€ μ°¨ μžˆμ§€ μ•Šμ•„λ„ λ˜μ§€λ§Œ μ™Όμͺ½μ΄ μ±„μ›Œμ Έμ•Ό ν•œλ‹€.

Binary Search Tree 자료ꡬ쑰

class BinarySearchTree {
  constructor(value) {
		// constructor둜 λ§Œλ“  κ°μ²΄λŠ” 이진 탐색 트리의 Nodeκ°€ λ©λ‹ˆλ‹€.
    this.value = value;
    this.left = null;
    this.right = null;
  }

	// 이진 탐색 트리의 μ‚½μž…ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“­λ‹ˆλ‹€.
  insert(value) {
		// μž…λ ₯값을 κΈ°μ€€μœΌλ‘œ, ν˜„μž¬ λ…Έλ“œμ˜ 값보닀 ν¬κ±°λ‚˜ μž‘μ€ 것에 λŒ€ν•œ 쑰건문이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
		// 보닀 μž‘λ‹€λ©΄, Node의 μ™Όμͺ½μ΄ λΉ„μ–΄ μžˆλŠ”μ§€ 확인 ν›„ 값을 λ„£μŠ΅λ‹ˆλ‹€.
    if (value < this.value) {
      if (this.left === null) {
        this.left = new BinarySearchTree(value);
      } else {
				// TODO: λΉ„μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ ν•΄λ‹Ή λ…Έλ“œλ‘œ μ΄λ™ν•˜μ—¬ μ²˜μŒλΆ€ν„° λ‹€μ‹œ ν¬κ±°λ‚˜ μž‘μ€ 것에 λŒ€ν•œ 쑰건을 물어보아야 ν•  κ²ƒμž…λ‹ˆλ‹€.
				// TIP: μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
        this.left.insert(value);
      }
		// 보닀 크닀면, Node의 였λ₯Έμͺ½μ΄ λΉ„μ–΄ μžˆλŠ”μ§€ 확인 ν›„ 값을 λ„£μŠ΅λ‹ˆλ‹€.
    } else if (value > this.value) {
      if (this.right === null) {
        this.right = new BinarySearchTree(value);
      } else {
				// TODO: λΉ„μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ ν•΄λ‹Ή λ…Έλ“œλ‘œ μ΄λ™ν•˜μ—¬ μ²˜μŒλΆ€ν„° λ‹€μ‹œ ν¬κ±°λ‚˜ μž‘μ€ 것에 λŒ€ν•œ 쑰건을 물어보아야 ν•  κ²ƒμž…λ‹ˆλ‹€.
				// TIP: μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
        this.right.insert(value);
      }
		//그것도 μ•„λ‹ˆλΌλ©΄, μž…λ ₯값이 νŠΈλ¦¬μ— λ“€μ–΄ μžˆλŠ” κ²½μš°μž…λ‹ˆλ‹€.
    } else {
      // 아무것도 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      return;
    }
  }
  // μ•žμ„œ κ΅¬ν˜„ν–ˆλ˜ νŠΈλ¦¬μ— λΉ„ν•΄ 이진 탐색 νŠΈλ¦¬λŠ” μž…λ ₯κ°’κ³Ό 트리 λ…Έλ“œμ˜ κ°’μ˜ 크기λ₯Ό λΉ„κ΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ™œ 그런 κ²ƒμΌκΉŒμš”?

	// 이진 탐색 트리 μ•ˆμ— ν•΄λ‹Ή 값이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“­λ‹ˆλ‹€.
  contains(value) {
		// TODO: 값이 ν¬ν•¨λ˜μ–΄ μžˆλ‹€λ©΄ trueλ₯Ό λ°˜ν™˜ν•˜μ„Έμš”.
    if (this.value === value) {
      return true;
    }
		// μž…λ ₯값을 κΈ°μ€€μœΌλ‘œ ν˜„μž¬ λ…Έλ“œμ˜ 값보닀 μž‘μ€μ§€ νŒλ³„ν•˜λŠ” 쑰건문이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
    if (value < this.value) {
			// TODO: ν˜„μž¬ λ…Έλ“œμ˜ μ™Όμͺ½μ΄ λΉ„μ–΄ μžˆμ§€ μ•Šκ³ , λ…Έλ“œμ˜ 값이 μž…λ ₯κ°’κ³Ό μΌμΉ˜ν•˜λ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
			if(this.left !== null && this.left.value === value){
        return true;
      }else {
        this.contains(this.left.value);
      }
			// TODO:μΌμΉ˜ν•˜μ§€ μ•Šλ‹€λ©΄ μ™Όμͺ½ λ…Έλ“œλ‘œ μ΄λ™ν•˜μ—¬ λ‹€μ‹œ νƒμƒ‰ν•©λ‹ˆλ‹€. 

    }
		// μž…λ ₯값을 κΈ°μ€€μœΌλ‘œ ν˜„μž¬ λ…Έλ“œμ˜ 값보닀 큰지 νŒλ³„ν•˜λŠ” 쑰건문이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
    if (value > this.value) {
			// TODO: ν˜„μž¬ λ…Έλ“œμ˜ 였λ₯Έμͺ½μ΄ λΉ„μ–΄ μžˆμ§€ μ•Šκ³ , λ…Έλ“œμ˜ 값이 μž…λ ₯κ°’κ³Ό μΌμΉ˜ν•˜λ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
			if(this.right !== null && this.right.value === value){
        return true;
      }else {
        this.contains(this.right.value);
      }
			// TODO:μΌμΉ˜ν•˜μ§€ μ•Šλ‹€λ©΄ 였λ₯Έμͺ½ λ…Έλ“œλ‘œ μ΄λ™ν•˜μ—¬ λ‹€μ‹œ νƒμƒ‰ν•©λ‹ˆλ‹€. 

    }
		// μ—†λ‹€λ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    return false;
  }

	/*
	트리의 μˆœνšŒμ— λŒ€ν•΄ κ΅¬ν˜„μ„ ν•©λ‹ˆλ‹€.
  μ§€κΈˆ λ§Œλ“œλ €κ³  ν•˜λŠ” 이 순회 λ©”μ„œλ“œλŠ” 단지 순회만 ν•˜λŠ” 것이 μ•„λ‹Œ, ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„ 콜백 ν•¨μˆ˜μ— 값을 μ μš©μ‹œν‚¨ 것을 μˆœνšŒν•΄μ•Ό ν•©λ‹ˆλ‹€.
  μ „μœ„ 순회λ₯Ό 톡해 μ–΄λ–»κ²Œ νƒμƒ‰ν•˜λŠ”μ§€ 이해λ₯Ό ν•œλ‹€λ©΄ μ€‘μœ„μ™€ ν›„μœ„ μˆœνšŒλŠ” μ‰½κ²Œ λ‹€κ°€μ˜¬ κ²ƒμž…λ‹ˆλ‹€.
	*/

	// 이진 탐색 트리λ₯Ό μ „μœ„ μˆœνšŒν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“­λ‹ˆλ‹€.
  preorder(callback) {
		callback(this.value);
    if (this.left) {
      this.left.preorder(callback);
    };
    if (this.right) {
      this.right.preorder(callback);
    };
  }

	// 이진 탐색 트리λ₯Ό μ€‘μœ„ μˆœνšŒν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“­λ‹ˆλ‹€.
  inorder(callback) {
		//TODO: μ „μœ„ 순회λ₯Ό λ°”νƒ•μœΌλ‘œ μ€‘μœ„ 순회λ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
    if(this.left){
      this.left.inorder(callback);
    }

    callback(this.value);

    if(this.right){
      this.right.inorder(callback);
    }
  }

	// 이진 탐색 트리λ₯Ό ν›„μœ„ μˆœνšŒν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“­λ‹ˆλ‹€.
  postorder(callback) {
		//TODO: μ „μœ„ 순회λ₯Ό λ°”νƒ•μœΌλ‘œ ν›„μœ„ 순회λ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
    if(this.left){
      this.left.postorder(callback);
    }
    if(this.right){
      this.right.postorder(callback);
    }

    callback(this.value);
  }

}
profile
Loding...

0개의 λŒ“κΈ€