Step-by-Step
[Java] Daily LeetCode Challenge 106. Construct Binary Tree from Inorder and Postorder Traversal 본문
언어/JAVA
[Java] Daily LeetCode Challenge 106. Construct Binary Tree from Inorder and Postorder Traversal
희주(KHJ) 2023. 3. 16. 19:10Construct Binary Tree from Inorder and Postorder Traversal - LeetCode
Can you solve this real interview question? Construct Binary Tree from Inorder and Postorder Traversal - Given two integer arrays inorder and postorder where inorder is the inorder traversal of a binary tree and postorder is the postorder traversal of the
leetcode.com
postorder은 root가 마지막에 나오고, inorder은 root가 가운데 나온다.
방법
1. inorder 배열에서 root 중심으로 앞 뒤 나눠서 HashSet에 저장
2. postorder에서 각 HashSet에 들어있는 숫자중에 idx가 가장 높은 점을 찾아냄 (해당 branch의 root임)
3. root 중심으로 다시 1번부터 dfs 진행
[코드]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int[] inorder, postorder;
public TreeNode buildTree(int[] inorder, int[] postorder) {
this.inorder = inorder;
this.postorder = postorder;
TreeNode root = setChild(postorder.length-1, 0, postorder.length-1);
return root;
}
public TreeNode setChild(int rootIdx, int start, int end){
TreeNode root = new TreeNode(postorder[rootIdx]);
HashSet<Integer> pre = new HashSet<Integer>();
HashSet<Integer> aft = new HashSet<Integer>();
int mid = -1;
for(int i=start; i<=end; i++){
if(inorder[i]==root.val){
mid = i;
continue;
}
if(mid==-1)
pre.add(inorder[i]);
else
aft.add(inorder[i]);
}
if(pre.size()>0)
root.left = setChild(getRootIdx(pre), start, mid-1);
if(aft.size()>0)
root.right = setChild(getRootIdx(aft), mid+1, end);
return root;
}
public int getRootIdx(HashSet<Integer> hs){
boolean findRange = false;
int end=-1;
for(int i=0; i<postorder.length; i++){
if(hs.contains(postorder[i])){
if(!findRange)
findRange = true;
end = i;
}else if(findRange){
break;
}
}
return end;
}
}
'언어 > JAVA' 카테고리의 다른 글
[Java] 백준 23289 - 온풍기 안녕! (0) | 2023.03.22 |
---|---|
[Java] Daily LeetCode Challenge 2492. Minimum Score of a Path Between Two Cities (0) | 2023.03.22 |
[Java] Daily LeetCode Challenge 958. Check Completeness of a Binary Tree (0) | 2023.03.15 |
[Java] Daily LeetCode Challenge 23. Merge k Sorted Lists (0) | 2023.03.12 |
[Java] Daily LeetCode Challenge 109. Convert Sorted List to Binary Search Tree (0) | 2023.03.11 |
Comments