[JS] 이진 트리 순회

Hant·2021년 10월 6일
0

JS Algorithm

목록 보기
5/16
post-thumbnail

1. Node Class

class BinaryTreeNode {
  constructor(val) {
    this.value = val;
    this.left = null;
    this.right = null;
  }
}

2. 선순위 순회

function traversePreOreder(node, callbackFunc) {
  callbackFunc(node.value);
  if (node.left) traversePreOreder(node.left, callbackFunc);
  if (node.right) traversePreOreder(node.right, callbackFunc);
}

재귀를 사용하지 않는 방법

function traversePreOrederIterative(node, callbackFunc) {
  const nodeStack = [node];

  while (nodeStack.length) {
    const cur = nodeStack.pop();
    callbackFunc(cur.value);

    if (cur.right) nodeStack.push(cur.right);
    if (cur.left) nodeStack.push(cur.left);
  }
}

2. 중순위 순회

function traverseInOrder(node, callbackFunc) {
  if (node.left) traverseInOrder(node.left, callbackFunc);
  callbackFunc(node.value);
  if (node.right) traverseInOrder(node.right, callbackFunc);
}

재귀를 사용하지 않는 방법

function traverseInOrderOterative(node, callbackFunc) {
  const stack = [];
  let cur = node;

  while (true) {
    if (cur !== null) {
      stack.push(cur);
      cur = cur.left;
      continue;
    }
    
    if (stack.length) {
      cur = stack.pop();
      callbackFunc(cur.value);
      cur = cur.right;
      continue;
    }

    break;
  }
}

3. 후순위 순회

function traversePostOrder(node, callbackFunc) {
  if (node.left) traversePostOrder(node.left, callbackFunc);
  if (node.right) traversePostOrder(node.right, callbackFunc);
  callbackFunc(node.value);
}

재귀를 사용하지 않는 방법

function traversePostOrderIterative(node, callbackFunc) {
  const stack1 = [node];
  const stack2 = [];

  while (stack1.length) {
    const cur = stack1.pop();
    stack2.push(cur.value);

    if (cur.left) stack1.push(cur.left);
    if (cur.right) stack1.push(cur.right);
  }


  for (let i = stack2.length - 1; i >= 0; i -= 1) {
    callbackFunc(stack2[i]);
  }
}
profile
끊임없이 도전하는 프론트 개발자가 되고자 노력합니다.

0개의 댓글

관련 채용 정보