logoStephen's 기술블로그

포스트 검색

제목, 태그로 포스트를 검색해보세요

[LeetCode] Binary Tree Inorder Traversal

[LeetCode] Binary Tree Inorder Traversal
CodingTest
성훈 김
2025년 9월 15일
목차

문제 링크

문제 요구 조건

문제는 이진트리 중위 순회라는 문제에요. 중위 순회라는 의미는 왼쪽 자식 > 현재 노드 > 오른쪽 자식 의 순서로 방문하는 것을 의미해요.
  • root라는 연결노드 배열을 매개변수로 받아요.
  • 중위순회대로 숫자배열을 반환해야 돼요.
 

저의 문제풀이?

아직 연결 노드 문제가 조금 어려운거 같아요. 전혀 풀지를 못해서 바로 풀이로 가실게요. ㅠ
 

문제 풀이

이 코드는 스택을 이용해서 트리의 노드들을 순서대로 방문하여 값을 배열에 추가해요. 중위 순회는 위에 말한 대로 왼쪽 자식 > 현재 노드 > 오른쪽 자식 의 순서로 방문하는 것을 의미해요.
 
최고의 성능을 낸 풀이방법
TypeScript
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    let current = root;
    let stack = [];
    let ans = [];

    while(current || stack.length){
        while(current){
            stack.push(current);
            current = current.left;
        }
        current = stack.pop();
        ans.push(current.val);
        current = current.right;
    }
    return ans;
};
 

사용된 변수 설명

  • current
    • 현재 방문 중인 노드를 가리키는 변수에요. 시작은 트리의 root 노드에요
  • stack
    • 아직 방문하지 않았지만, 나중에 다시 돌아와서 방문해야 될 부모 노드들을 임시로 저장하는 스택 자료구조에요.
  • ans
    • 중위 순회 결과를 저장하는 배열이에요.
 
 
코드 자체에는 총 두가지의 주요 단계로 나누어져요.
  1. 가장 왼쪽 노드까지 이동 및 스택에 노드 쌓기
      • while(current) 루프는 현재 노드(current)가 null이 아닐 때까지 반복해요.
      • 이 루프 안에서 current 노드를 스택에 푸시하고, currentcurrent.left 로 계속 업데이트 해요.
      • 이 과정을 통해서 트리의 가장 왼쪽 끝 노드에 도달하게 되고, 그 경로에 있는 모든 부모 노드들이 스택에 차례대로 쌓이게 되죠.
      • 이 단계가 끝나면 current는 null이 되고, 스택의 맨 위의 가장 왼쪽 노드가 위치하게 되요.
  1. 노드 방문 및 오른쪽 자식으로 이동
      • 바깥 쪽의 while(current || stack.length) 루프는 currentnull 이거나 스택에 노드가 남아있는 동안 계속 실행되어요
      • 첫 번째 while가 끝나면, 스택에서 노드를 pop하여 current 에 할당 해요. 이 노드가 바로 트리의 가장 왼쪽 노드인 거죠.
      • ans.push(current.val) 코드를 통해 이 노드의 값을 결과 배열에 추가해요.
      • 그리고 current = current.right 코드를 통해 current 를 오른쪽 자식 노드로 업데이트해요. 이제 다음 순회는 오른쪽 자식 노드부터 시작하는 거죠.
        • 만약 오른쪽 자식 노드가 있다면, 바깥 while 루프의 다음 반복에서 다시 첫 번째 while 루프로 진입해서 그 노드의 가장 왼쪽 자식까지 탐색을 해요.
        • 만약 오른쪽 자식 노드가 없다면, currentnull이 되고, 스택에서 다음 노드를 팝하여 방문하게 되어요.