[JavaScript-์ž๋ฃŒ๊ตฌ์กฐ] Tree

Hannahhhยท2022๋…„ 9์›” 21์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
41/47

๐Ÿ” Tree


๋‹จ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ํ•œ ๊ตฌ์กฐ๋กœ, ํ•˜๋‚˜์˜ ๋ฟŒ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๊ฐ€์ง€๊ฐ€ ์‚ฌ๋ฐฉ์œผ๋กœ ๋ป—์€ ํ˜•ํƒœ๊ฐ€ ๋‚˜๋ฌด์™€ ๋‹ฎ์•„ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋‚˜์—ด์‹œํ‚จ ์„ ํ˜• ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์•„๋ž˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์„ ํ˜• ๊ตฌ์กฐ๋กœ, ์•„๋ž˜๋กœ๋งŒ ๋ป—์–ด๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ดํด์ด ์—†๋‹ค.

์ฆ‰, ์‚ฌ์ดํด์ด ์—†๋Š” ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


์œ„์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ๊ณ ํ•ด ์šฉ์–ด๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

  • ๋…ธ๋“œ(Node) : ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๋Š” ๋ชจ๋“  ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ
  • ๋ฃจํŠธ(Root) : ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์‹œ์ž‘์ ์ด ๋˜๋Š” ๋…ธ๋“œ

  • ๋ถ€๋ชจ ๋…ธ๋“œ(Parent node) : ๋‘ ๋…ธ๋“œ๊ฐ€ ์ƒํ•˜๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฃจํŠธ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ

  • ์ž์‹ ๋…ธ๋“œ(Child node) : ๋‘ ๋…ธ๋“œ๊ฐ€ ์ƒํ•˜๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฃจํŠธ์—์„œ ๋จผ ๋…ธ๋“œ

  • ๋ฆฌํ”„(Leaf) : ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ๋ ์ง€์ ์ด๋ฉฐ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ

  • ๊นŠ์ด(depth)
    ๋ฃจํŠธ~ํ•˜์œ„ ๊ณ„์ธต์˜ ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€์˜ ๊นŠ์ด

    ex) root = 0 / Q,R = 1 / A,B,C,D = 2 ...


  • ๋ ˆ๋ฒจ(level)
    ๊ฐ™์€ ๊นŠ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฌถ์–ด์„œ ๋ ˆ๋ฒจ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ™์€ ๋ ˆ๋ฒจ์— ๋‚˜๋ž€ํžˆ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ˜•์ œ๋…ธ๋“œ(Slibling Node)๋ผ๊ณ  ํ•œ๋‹ค.

    ex) P = 1 / Q,R = 2 / A,B,C,D = 3 ...

  • ๋†’์ด(Height)
    ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฃจํŠธ๊นŒ์ง€์˜ ๋†’์ด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ex) E,F,G,B,H,I,D = 0 / L,M = 1 / A,C = 2 / Q,R = 3 / P = 4


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

    ex) (L,E,F,G) / (Q,A,B) / (M,H,I) / (R,C,D) / (R,C,D,M,H,I) / ...



โœ” ๊ธฐ๋ณธ ์ฝ”๋“œ

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

	// ํŠธ๋ฆฌ์˜ ์‚ฝ์ž… ๋ฉ”์„œ๋“œ.
  //tree์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑ ํ•œ ํ›„์—, ๋…ธ๋“œ์˜ children์— push
  insertNode(value) {
    const childNode = new Tree(value);
    this.children.push(childNode);
  }

	// ํŠธ๋ฆฌ ์•ˆ์— ํ•ด๋‹น ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ.
  // tree์—์„œ value๊ฐ’์„ ํƒ์ƒ‰ -> ํ˜„์žฌ ๋…ธ๋“œ์˜ value ๊ฐ’์ด ์ฐพ๋Š” ๊ฐ’๊ณผ ์ผ์น˜ํ•œ๋‹ค๋ฉด return.
  contains(value) {
    if (this.value === value) {
      return true;
    }

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

// ์ž…์ถœ๋ ฅ
const rootNode = new Tree(null);

for(let i = 0; i <= 4; i++) {
  if(rootNode.children[i]) {
    rootNode.children[i].insertNode(i);
  }
 rootNode.insertNode(i); 
}
rootNode; // {value: null, children: Array(5)}
rootNode.contains(5); // false
rootNode.contains(1); // true




๐Ÿ‘€ ์‹ค์‚ฌ์šฉ ์˜ˆ์‹œ


โœ” ์ปดํ“จํ„ฐ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ


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


  • ๊ทธ ์™ธ ์›”๋“œ์ปต ํ† ๋„ˆ๋จผํŠธ ๋Œ€์ง„ํ‘œ, ๊ฐ€๊ณ„๋„, ์กฐ์ง๋„ ๋“ฑ




Reference: ์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

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