TIL(39) Tree

codedotยท2021๋…„ 8์›” 28์ผ
0
post-thumbnail

Tree(ํŠธ๋ฆฌ) โœ๐Ÿป

Tree(ํŠธ๋ฆฌ)๐Ÿ“


  • ์ž๋ฃŒ๊ตฌ์กฐ Tree๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋‚˜๋ฌด์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ •ํ™•ํžˆ๋Š” ๋‚˜๋ฌด๋ฅผ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘์–ด ๋†“์€ ๋“ฏํ•œ ๋ชจ์Šต์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๊ทธ๋ž˜ํ”„์˜ ์—ฌ๋Ÿฌ ๊ตฌ์กฐ ์ค‘ ๋‹จ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ํ•œ ๊ตฌ์กฐ๋กœ, ํ•˜๋‚˜์˜ ๋ฟŒ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๊ฐ€์ง€๊ฐ€ ์‚ฌ๋ฐฉ์œผ๋กœ ๋ป—์€ ํ˜•ํƒœ๊ฐ€ ๋‚˜๋ฌด์™€ ๋‹ฎ์•„ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ผ ๋ถ€๋ฅธ๋‹ค.

  • ํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋ฃจํŠธ(Root) ๋ผ๋Š” ํ•˜๋‚˜์˜ ๊ผญ์ง“์  ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„์„ (edge)์œผ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
  • ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ๋“œ(Node) ๋ผ๊ณ  ํ•˜๋ฉฐ, ๋‘๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์ƒํ•˜๊ณ„์ธต์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด ๋ถ€๋ชจ/์ž์‹ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์œ„ ๊ทธ๋ฆผ์— ๋ถ€๋ชจ ๋…ธ๋“œ(Parent Node), ์ž์‹ ๋…ธ๋“œ(Child Node) ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ๋Š” ๋‚˜๋ฌด์˜ ์žŽ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•˜์—ฌ ๋ฆฌํ”„ ๋…ธ๋“œ(leaf Node)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์šฉ์–ด์ •๋ฆฌ

  • ๋…ธ๋“œ(Node) : ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๋Š” ๋ชจ๋“  ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ
  • ๋ฃจํŠธ(Root) : ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์‹œ์ž‘์ ์ด ๋˜๋Š” ๋…ธ๋“œ
  • ๋ถ€๋ชจ ๋…ธ๋“œ(Parent node) : ๋‘ ๋…ธ๋“œ๊ฐ€ ์ƒํ•˜๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฃจํŠธ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ
  • ์ž์‹ ๋…ธ๋“œ(Child node) : ๋‘ ๋…ธ๋“œ๊ฐ€ ์ƒํ•˜๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฃจํŠธ์—์„œ ๋จผ ๋…ธ๋“œ
  • ๋ฆฌํ”„(Leaf) : ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ๋์ง€์ ์ด๊ณ , ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ

Tree์˜ ํŠน์ง•๐Ÿ“Œ

๊นŠ์ด(Depth)

  • ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ ํ•˜์œ„ ๊ณ„์ธต์˜ ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€์˜ ๊นŠ์ด๋ฅผ ํ‘œํ˜„
  • ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ์ง€๋ฉด์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊นŠ์ด๊ฐ€ 0์ด๋‹ค.
  • ์œ„ ๊ทธ๋ฆผ์—์„œ ๋ฃจํŠธ 56์˜ depth๋Š” 0์ด๊ณ , 30๊ณผ 70์˜ ๊นŠ์ด๋Š” 1์ด๋‹ค. 22, 40, 60, 95์˜ ๊นŠ์ด๋Š” 2์ด๋‹ค.

๋ ˆ๋ฒจ(Level)

  • ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๊ฐ™์€ ๊นŠ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฌถ์–ด์„œ ๋ ˆ๋ฒจ(level)๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • depth๊ฐ€ 0์ธ 56์˜ level์€ 1์ด๋‹ค.
  • depth๊ฐ€ 1์ธ 30๊ณผ 70์˜ level์€ 2์ด๋‹ค.
  • 22, 40, 60, 95์˜ level์€ 3์ด๊ณ , ๊ฐ™์€ ๋ ˆ๋ฒจ์— ๋‚˜๋ž€ํžˆ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ˜•์ œ ๋…ธ๋“œ(sibling node)๋ผ๊ณ  ํ•œ๋‹ค.

๋†’์ด(Height)

  • ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฃจํŠธ๊นŒ์ง€์˜ ๋†’์ด(height)๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌํ”„ ๋…ธ๋“œ์™€ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ๋†’์ด๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ๋†’์€ height ๊ฐ’์— +1ํ•œ ๊ฐ’์„ ๋†’์ด๋กœ ๊ฐ€์ง„๋‹ค.
  • ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ๋†’์ด๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ์—๋Š” ๊ฐ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๋†’์ด๋ฅผ 0์œผ๋กœ ๋†“๋Š”๋‹ค.

์„œ๋ธŒ ํŠธ๋ฆฌ(Sub Tree)

  • ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ Root์—์„œ ๋ป—์–ด๋‚˜์˜ค๋Š” ํฐ ํŠธ๋ฆฌ์˜ ๋‚ด๋ถ€์—, ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ˜ ์ž‘์€ ํŠธ๋ฆฌ๋ฅผ ์„œ๋ธŒ ํŠธ๋ฆฌ ๋ผ ํ•œ๋‹ค.

ํŠธ๋ฆฌ์˜ ์‹ค์‚ฌ์šฉ ์˜ˆ์ œ๐Ÿ“Œ

  • ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ œ๋Š” ์ปดํ“จํ„ฐ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์ด๋‹ค.
  • ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ, ๋ฐ”ํƒ•ํ™”๋ฉด ํด๋”๋‚˜ ๋‹ค์šด๋กœ๋“œ ํด๋” ๋“ฑ์—์„œ ๋‹ค๋ฅธ ํด๋”์— ์ง„์ž…ํ•˜๊ณ , ๋˜ ๊ทธ ์•ˆ์—์„œ ๋‹ค๋ฅธ ํด๋”์— ์ง„์ž…ํ•˜๋ฉด์„œ ์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํŒŒ์ผ์„ ์ฐพ๋Š”๋‹ค.
  • ๋ชจ๋“  ํด๋”๋Š” ํ•˜๋‚˜์˜ ํด๋”(๋ฃจํŠธ ํด๋”, /)์—์„œ ์‹œ์ž‘๋˜์–ด, ๊ฐ€์ง€๋ฅผ ๋ป—์–ด๋‚˜๊ฐ€๋Š” ๋ชจ์–‘์ƒˆ๋ฅผ ๋ˆ๋‹ค.

    ํŠธ๋ฆฌ์˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ
    ์›”๋“œ์ปต ํ† ๋„ˆ๋จผํŠธ ๋Œ€์ง„ํ‘œ, ๊ฐ€๊ณ„๋„(์กฑ๋ณด), ์กฐ์ง๋„ ๋“ฑ

BST ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๐Ÿ“Œ

์‚ฝ์ž… : ์ด ๋ฉ”์„œ๋“œ๋Š” ๊ฐ’์„ ์ˆ˜๋ฝํ•˜๊ณ  ์ƒˆ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค. ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ด ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ จ์˜ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ์— ์žˆ๋Š” ๋‚ฎ์€ ๊ฐ’๊ณผ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋†’์€ ๊ฐ’์˜ ๊ธฐ์ค€์„ ์ถฉ์ ํ•˜๋Š” ์œ„์น˜์— ๋ฐฐ์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๊ฐ’์ด ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋Š” undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

class Node {
    constructor(val){
        this.val = val
        this.left = null
        this.right = null
    }
}

class BinarySearchTree {
  constructor(){
      this.size = 0
      this.root = null
  }
}

let bst1 = new BinarySearchTree()
let node1 = new Node(1)

bst1 // BinarySearchTree {size: 0, root: null}
node1 // Node {val: 1, left: null, right: null}

์กฐํšŒ : ํ”„๋กœ์„ธ์Šค๋Š” ํŠธ๋ฆฌ์—์„œ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์œ ์‚ฌํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค.
๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋Š” undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

class Node{
    constructor(val){
        this.val = val
        this.left = null
        this.right = null
    }
}

class BinarySearchTree {
  constructor(){
      this.size = 0
      this.root = null
  }

  insert(val){
    let newNode = new Node(val)
    if(!this.root){
      this.root = newNode
      this.size++
      return this
    }
    let current = this.root
    while(true){
      if(val === current.val) return undefined
      if(val < current.val){
        if(!current.left){
          current.left = newNode
          this.size++
          return this
        } else {
          current = current.left
        }
      } else if (val > current.val){
        if(!current.right){
          current.right = newNode
          this.size++
          return this
        } else {
          current = current.right
        }
      }
    }
  }

  lookup(val){
    if(!this.root) return undefined
    let current = this.root
    while(true){
      if(val === current.val) return current
      if(val > current.val){
        if(!current.right) return undefined
        current = current.right
      } else if (val < current.val){
        if(!current.left) return undefined
        current = current.left
      }
    }
  }
}

let bst = new BinarySearchTree()
bst.insert(10)
bst.insert(6)
bst.insert(3)
bst.insert(8)
bst.insert(15)
bst.insert(20)
bst // BinarySearchTree {size: 6, root: Node}
bst.lookup(10) // Node {val: 10, left: Node, right: Node}
bst.lookup(3)  // Node {val: 3, left: null, right: null}

Tree ์ž๋ฃŒ๊ตฌ์กฐ

class Tree {
  constructor(value) {
		// constructor๋กœ ๋งŒ๋“  ๊ฐ์ฒด๋Š” ํŠธ๋ฆฌ์˜ Node๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    this.value = value;
    this.children = [];
  }

	// ํŠธ๋ฆฌ์˜ ์‚ฝ์ž… ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  insertNode(value) {
		// ๊ฐ’์ด ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  ์–ด๋Š ์œ„์น˜์— ๋ถ™๋Š”์ง€ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
		// TODO: ํŠธ๋ฆฌ์— ๋ถ™๊ฒŒ ๋  childNode๋ฅผ ๋งŒ๋“ค๊ณ , children์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    const childNode = new Tree(value);
    this.children.push(childNode);
  }

	// ํŠธ๋ฆฌ ์•ˆ์— ํ•ด๋‹น ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  contains(value) {
		// TODO: ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”. 
    if (this.value === value) {
      return true;
    }
		// TODO: ๊ฐ’์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ children ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ childNode๋ฅผ ํƒ์ƒ‰ํ•˜์„ธ์š”.
	  for (let i = 0; i < this.children.length; i++) {
      const childNode = this.children[i];
        if (childNode.contains(value)) {
          return true;
    }
		// ์ „๋ถ€ ํƒ์ƒ‰ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.  
    
  }
  return false;
}
}
profile
Loding...

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด