Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 자바
- 코테
- 자바 리트코드
- 스프링 에러
- 그래프 자바
- 백준 18222
- 리트코드 자바
- 파이썬
- java 프로그래머스
- leetcode 1721
- daily challenge
- 백준
- 구현
- 스택
- dfs
- leetcode
- DP
- 프로그래머스 java
- 카카오
- 자바 5464
- java leetcode
- 분할정복
- Java
- 인텔리제이 에러
- 프로그래머스
- 리트코드 1557
- 리트코드
- 코딩테스트
- BFS
- 백준 16935
Archives
- Today
- Total
레벨업 일지
[Java] leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal 본문
알고리즘/leetcode
[Java] leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal
24시간이모자란 2023. 3. 17. 09:36문제
Construct Binary Tree from Inorder and Postorder Traversal - LeetCode
알아야 할 개념
- inorder
- postorder
풀이
탐색 순서는 다음과 같다.
preorder : root -> left -> right
inorder : left -> root -> right
postorder : left -> right -> root
주어진 예제 1번을 보면
Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
Output: [3,9,20,null,null,15,7]
처음에 탐색을 시작할때, 알 수 있는 특징은, postorder의 맨 마지막 원소가 루트 라는 사실이다.(모든 캐이스에서 성립)
postorder : left -> right -> root 순으로 탐색하기 때문에, [start .. end] 구간을 탐색할 때 루트를 먼저 찾는다.
풀이 알고리즘은 다음과 같다.
- 루트 인덱스 탐색
- 재귀로 루트 right 노드 탐색해서 연결
- 재귀로 루트 left 노드 탐색해서 연결
- 현재 레벨에서 루트 return
left , right 순이 아닌 right left 순으로 연결하는 이유는 postorderIndex 를 만들어 postorder 뒤에서부터 앞으로 탐색한다.
postorder는 left , right, root 순서니깐 거꾸로 탐색하면 root right left 순이다. 따라서 right를 먼저 탐색해서 연결해준다.
코드
class Solution {
int postIndex ;
public TreeNode buildTree(int[] inorder, int[] postorder) {
int n = postorder.length ;
if(n == 0)return null;
if(n == 1 )return new TreeNode(inorder[0]);
postIndex = n-1;
return helper(inorder, postorder, 0, n-1);
}
public TreeNode helper(int[] inorder, int[] postorder, int start, int end){
if(start > end || postIndex<0) return null;
TreeNode root = new TreeNode(postorder[postIndex--]);
int rootIndex = findN(inorder, root.val);
root.right = helper(inorder, postorder, rootIndex+1, end);
root.left = helper(inorder, postorder, start, rootIndex-1);
return root;
}
public int findN(int[] arr, int key){
for(int i = 0 ;i < arr.length ;i++){
if(arr[i] == key)return i;
}
return -1;
}
}
'알고리즘 > leetcode' 카테고리의 다른 글
[Java] leetcode 605. Can Place Flowers (0) | 2023.03.20 |
---|---|
[Java] leetcode 1472. Design Browser History (0) | 2023.03.18 |
[Java] leetcode 997. Find the Town Judge (0) | 2023.02.23 |
[Java] leetcode 37. Sudoku Solver (2) | 2023.02.20 |
[Java] leetcode 103. Binary Tree Zigzag Level Order Traversal (0) | 2023.02.19 |
Comments