Problem
트리가 주어졌을 때 inorder
순회한 결과를 리턴하는 문제입니다.
Solution
많이 알려진 재귀로 풀면 O(n)
에 풀리겠지만 Follow up 에 다음 문장이 있었습니다.
Recursive solution is trivial, could you do it iteratively?
iterative 하게 푸는 방법은 Stack
을 이용해서 다음 4 개 플로우를 반복하면 됩니다.
- 현재 노드의 왼쪽 자식 노드를 전부
Stack
에 담는다. Stack
에서 하나 pop 해서res
에 담는다. (재귀로 깊게 들어갔다가 빠져 나오면서 넣는 것과 비슷)- 현재 노드에서 오른쪽 자식 노드로 이동한다.
- 현재 노드가
null
이 아니라면 1~3 의 과정을 반복한다.
그림을 통해 표현하면 다음과 같습니다.
녹색으로 칠해진 노드는 현재 노드인 node
를 나타낸다고 생각하시면 됩니다.
1. Root 에서 시작, 왼쪽 자식 노드를 전부 Stack 에 담는다.
[3, 2, 1] 순서로 담기게 되어 pop
할 때는 depth 가 깊은 순인 [1, 2, 3] 순서로 나옵니다.
2. Stack 에서 Pop 하면서 val 을 담는다. (1)
이때 오른쪽 노드의 상태를 확인합니다.
코드상으로는 node = node.right
로 매번 이동하지만, null
값이기 때문에 무시됩니다.
3. Stack 에서 Pop 하면서 val 을 담는다. (2)
4. Stack 에서 Pop 하면서 val 을 담는다. (3)
오른쪽 자식 노드가 null
이 아니기 때문에 이동합니다.
5. 1 번에서 했던 것처럼 현재 노드를 기준으로 왼쪽 자식 노드를 전부 Stack 에 담는다.
이후 과정은 현재 노드에서 1, 2, 3, 4 를 다시 반복하며 inorder
순회가 완성됩니다.
최종적으로는 노드의 숫자 순서대로 전부 출력됩니다.
Java Code
// 1. recursive
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
traverse(res, root);
return res;
}
public void traverse(List<Integer> res, TreeNode node) {
if (node == null) return;
traverse(res, node.left);
res.add(node.val);
traverse(res, node.right);
}
}
// 2. iterative
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.add(node);
node = node.left;
}
node = stack.pop();
res.add(node.val);
node = node.right;
}
return res;
}
}
Kotlin Code
class Solution {
fun inorderTraversal(root: TreeNode?): List<Int> = root?.let {
inorderTraversal(root.left) + root.`val` + inorderTraversal(root.right)
} ?: listOf()
}
'알고리즘 문제 > LeetCode' 카테고리의 다른 글
[LeetCode Easy] Valid Anagram (Java, Kotlin) (0) | 2020.11.21 |
---|---|
[LeetCode Medium] Generate Parentheses (Java) (0) | 2020.11.16 |
[LeetCode Medium] Permutations (Java, Kotlin) (0) | 2020.11.15 |
[LeetCode Easy] Fizz Buzz (Java, Kotlin) (0) | 2020.11.13 |
[LeetCode Easy] Delete Node in a Linked List (Java, Kotlin) (0) | 2020.11.12 |