본문 바로가기
자료구조 공부

[Data-Structure] Tree (트리)와 Binary Search Tree (이진 탐색 트리) (1)Tree 구조란

by 개미는뚠뚠딴 2020. 10. 26.
반응형

오늘은 트리 구조(Tree)와 이진 탐색 트리(Binary Search Tree)에 대해서 공부해보았다.

트리 구조란 노드로 구성된 계층적 자료구조이다. 최상위 노드(루트)를 만들고, 루트 노드의 child를 추가하고, 그 child에 또 child를 추가하는 방식으로 트리 구조를 구현할 수 있다.

트리 구조 예시

 

트리 구조와 관련하여 반드시 알아야 할 개념들이다. [정보통신기술용어해설] 참조

  • A, B, C, D 등 트리의 구성요소를 노드(node) 라고 한다.
  • 위 그림의 A처럼, 트리 구조에서 최상위에 존재하는 노드를 root이다.
  • 루트를 기준으로, 다른 노드로의 접근하기 위한 거리를 depth 라고 한다.
  • 같은 부모를 가지면서 같은 depth에 존재하는 노드들은 sibling 관계에 있습니다. (같은 부모를 가진 노드들의 집합)
  • 그림에서 A는 B와 C의 부모(parent) 이고, B와 C는 A의 자식(child) 이다.
  • 노드와 노드를 잇는 선을 edge 라고 한다.
  • 자식이 없는 노드는 leaf 라고 한다.

여기서 depth와 height의 차이를 보자면 depth는  루트 노드에서 자신까지 가는 경로의 길이(루트 노드의 깊이는 0이다.)를 뜻하며
height는 그 노드와 단말 노드 사이의 경로의 최대 길이이다.(가장 긴 깊이)

배열을 이용해서 Tree를 간단하게 구현해 볼 수 있다. 

class TreeNode {
  constructor(value) {
    this.value = value;
    this.children = [];
  }

  // 트리에 노드를 추가
  insertNode(value) {
    let node = new TreeNode(); // 추가할 노드 생성
    node.value = value; // 노드의 값 변경
    this.children.push(node); // 현재 노드에 children 배열로 해당 노드를 추가
  }

  // 트리에 해당 노드가 존재하는지 여부를 반환
  contains(value) {
    if(this.value === value){ // 현재 노드의 value 값과 value값이 같다면 바로 리턴 true
      return true;
    }
    for(let el of this.children){ // children 배열에서 요소를 하나씩 꺼내서 비교
      if(el.children.length !== 0){ // el이 children을 가지고 있다면
        for(let childEl of el.children){
          let child = childEl.contains(value); // 재귀 형태로 value 값을 체크해주고
          if(child === true){ // 이 값이 true인지 비교 후 true가 아니면 다음 루프로 돌아가도록 해줌
            return true;
          }
        }
      }
      if(el.value === value){ // el이 children을 가지지않는데 value가 같다면
        return true;
      }
    }
    return false; // 모든 루프를 통과 후에도 같은 값이 없다면 false 리턴
  }
}

 

간단한 사용 예시를 보자면

let rootNode = new Tree(null); // rootNode 생성

rootNode.insertNode(5);
rootNode.insertNode(6);

rootNode.children[0].insertNode(7);
rootNode.children[1].insertNode(8);

rootNode.contains(7); // true
rootNode.contains(8); // true

// 구조
/*
   null -> rootNode
 5      6
7      8

*/

이렇게 된다. 

다음은 이진 탐색 트리(Binary Search Tree)에 대해서 알아보겠다.

반응형

댓글