✏️오늘의 문제
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>(); // 결과를 저장할 리스트 생성
helper(root, res); // 재귀 함수 호출
return res; // 결과 리스트 반환
}
public void helper(TreeNode root, List<Integer> res) {
if (root != null) { // 현재 노드가 null이 아닐 때
helper(root.left, res); // 왼쪽 서브트리 방문
res.add(root.val); // 현재 노드의 값 추가
helper(root.right, res); // 오른쪽 서브트리 방문
}
}
}
클래스 및 메소드 정의
class Solution
: 문제 해결을 위한 클래스를 정의합니다.public List<Integer> inorderTraversal(TreeNode root)
: 중위 순회를 수행하는 메소드로, 트리의 루트 노드를 인자로 받습니다.결과 저장
List<Integer> res = new ArrayList<>();
: 중위 순회 결과를 저장할 리스트를 생성합니다.재귀 호출
helper(root, res);
: 중위 순회를 수행하는 헬퍼 메소드를 호출합니다.헬퍼 메소드
public void helper(TreeNode root, List<Integer> res)
: 재귀적으로 노드를 방문하며 결과를 리스트에 추가합니다.if (root != null)
: 현재 노드가 null이 아닐 경우에만 진행합니다.helper(root.left, res);
: 왼쪽 서브트리를 먼저 방문합니다.res.add(root.val);
: 현재 노드의 값을 리스트에 추가합니다.helper(root.right, res);
: 오른쪽 서브트리를 방문합니다.이 코드를 사용하여 이진 트리를 중위 순회하고 결과를 출력할 수 있습니다.
1
/ \
2 3
위 트리에서 중위 순회를 수행하면, 결과는 [2, 1, 3]
가 됩니다.
이진 트리의 구조
TreeNode
클래스는 일반적으로 다음과 같이 정의됩니다:class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
재귀의 장점
시간 복잡도
공간 복잡도
비재귀적 접근
중위 순회를 비재귀적으로 구현할 수도 있습니다. 스택을 사용하여 현재 노드를 추적하고, 노드를 방문할 때마다 스택에 추가하고 제거하는 방식을 사용할 수 있습니다.
아래는 비재귀적 중위 순회 구현 예시입니다
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode current = root;
while (current != null || !stack.isEmpty()) {
while (current != null) {
stack.push(current);
current = current.left; // 왼쪽 자식으로 이동
}
current = stack.pop(); // 스택에서 노드 꺼내기
res.add(current.val); // 노드 값 추가
current = current.right; // 오른쪽 자식으로 이동
}
return res;
}
적용 사례
유사한 순회 방법