- Today
- Total
- λ€μ΅μ€νΈλΌ
- CS
- MST
- 벨λ§ν¬λ
- νλ‘κ·Έλλ¨Έμ€
- Algorithm
- tree
- λ¬Έλ²
- μλ°
- λ°±μ€
- Graph
- μΈν΄
- λ°μ΄ν°λ² μ΄μ€
- ꡬν
- μλ£κ΅¬μ‘°
- pytorch
- OOP
- PS
- database
- array
- java
- dp
- μ‘Έμ μν
- μλ°μμ μ
- leetcode
- BFS
- λ°±μλ
- μμμ λ ¬
- 그리λ
- spring
Partially Committed
[InOrder μ PostOrder λ‘λΆν° PreOrder ꡬνκΈ°] λ°±μ€ 2263 νΈλ¦¬μ μν (JAVA) λ³Έλ¬Έ
[InOrder μ PostOrder λ‘λΆν° PreOrder ꡬνκΈ°] λ°±μ€ 2263 νΈλ¦¬μ μν (JAVA)
WonderJay 2023. 3. 22. 16:31https://www.acmicpc.net/problem/2263
μ¬κ·λ νμ μ΄λ €μ΄ κ² κ°λ€.. π₯Ί
μ λ¬Έμ λ μ‘°κΈ νΉμ΄νλ°,
InOrder Traverse μ PostOreder Traverse κ° μ£Όμ΄μ‘μ λ PreOrder Traverse λ₯Ό μΆλ ₯νλ κ²μ΄ μꡬ μ¬νμ΄λ€.
μ..
μΌλ¨ Tree μ μνμμ κΈ°μ€μ΄ λλ κ²μ Root λ Έλμ΄λ€.
InOrder μ PostOrder λ μ£Όμ΄μ§λλ°,
μ΄λ‘λΆν° Root λ Έλλ₯Ό μ΄λ»κ² μ°Ύμ μ μμκΉ?
PostOrder λ left - right - root μμΌλ‘ μννλ―λ‘ PostOrder λ‘ μ£Όμ΄μ§ κ°λ€μ κ°μ₯ λ§μ§λ§μ΄ Root λ Έλμμ μ μ μλ€.
InOrder λ left - root - right μμΌλ‘ μννλ€.
κ·Έλ¬λ©΄ PostOrder μ ν΅ν΄ μ»μ Root λ Έλμ κ°μ μ΄μ©νμ¬,
InOrder μμ μ€μμ Root λ Έλλ₯Ό λͺ λ²μ§Έ λ°©λ¬Ένλ μ§ νμΈνλ©΄ (RootIdx)
Left Subtree μ Right Subtree λ₯Ό μ»μ΄λΌ μ μλ€.
μ΄λ»κ²?
InOrder λ°°μ΄μ 0~RootIdx-1 κΉμ§ = Left Subtree
InOrder λ°°μ΄μ RootIdx ~ n-1 κΉμ§ = Right Subtree
κ·Έλ¦¬κ³ κ°κ°μ Subtree μ λν΄μ μ μμ μ λ°λ³΅ν΄μ£Όλ©΄ λλ€.
μΈμ κΉμ§? (terminate condition)
λμ΄μ λ°©λ¬Έν μ μλ λ Έλκ° μμ λ κΉμ§!
μ΄μ μ½λλ‘ κ΅¬νν΄λ³΄μ.
ν¨μμ 맀κ°λ³μλ
νμ¬ Depth μμ InOrder μ μμμ§μ : InLeft
νμ¬ Depth μμ InOrder μ λμ§μ : InRight
νμ¬ Depth μμ PostOrder μ μμμ§μ : PostLeft
νμ¬ Depth μμ PostOrder μ λμ§μ : PostRight
static void printPreOrder(int inLeft, int inRight, int postLeft, int postRight) throws IOException
κ·Έλ¦¬κ³ terminate condition μ λμ΄μ νμν λ Έλκ° μμ λ μ’ λ£νλ€.
if(inLeft > inRight || postLeft > postRight)
return;
root λ Έλλ postOrder λ°°μ΄μ κ°μ₯ λμ μλ κ°μ΄λ€.
int root = postOrder[postRight];
μ root λ Έλλ₯Ό μ΄μ©νμ¬ InOrder μμ left subtree μ Right subtree λ₯Ό λΆλ¦¬νλ κ²μ΄ 1μ°¨μ μΈ λͺ©μ μ΄λ€.
μ΄λ₯Ό μν΄μλ InOrder μμ νμ¬ Depth μμμ root λ Έλλ₯Ό λͺ λ²μ§Έλ‘ νμνλ μ§ Index λ₯Ό μμλ΄μΌ νλ€.
κ°λ¨νκ² Linear search λ‘ κ΅¬ννμλ€.
int rootIdx = 0;
for(int i = inLeft; i<=inRight; i++){
if(inOrder[i] == root){
rootIdx = i;
}
}
κ·Έλ¦¬κ³ νμ¬ Depth μμ root λ Έλλ₯Ό μΆλ ₯νλ€.
bw.write(inOrder[rootIdx]+" ");
μ΄μ RootIdx λ₯Ό μ΄μ©νμ¬ LeftSubTree , RightSubTree μ Size λ₯Ό κ³μ°ν μ μλ€.
left - root - right μμΌλ‘ νμνλ InOrder μ νΉμ±μ μ΄μ©νλ©΄ λλλ°,
InOrder μμ root λ Έλλ rootIdx λ²μ§Έλ‘ νμνλ―λ‘
leftSubTree μ size λ rootIdx - inLeft
rightSubTree μ size λ inRight - rootIdx μ΄λ€.
μ΄μ κ°κ°μ μλΈνΈλ¦¬μ λν΄μ μ¬κ·μ μΌλ‘ λμΌν μμ μ μννμ.
λ¨Όμ left SubTree μ λν΄μ μκ°ν΄λ³΄μ.
inOrder λ°°μ΄μ μμμ μ λμΌν κ²μ΄λ€.
inOrder λ°°μ΄μ λμ μ Root μ μ΄μ κΉμ§μ΄λ€. (rootIdx-1)
PostOrder λ°°μ΄μ μμμ μ λμΌν κ²μ΄λ€.
PostOrder λ°°μ΄μ λμ μ PostOrder λ°°μ΄μ μμμ μμ leftSubTree μ size λ§νΌ λν λ€ 1 μ λΊ κ²μ΄λ€. (0 - index)
PostLeft + leftSubtreeSize λΌκ³ νλ©΄ Root λ Έλλ₯Ό ν¬ν¨νκ² λλ€.
printPreOrder(inLeft, rootIdx - 1, postLeft, postLeft + leftSubtreeSize - 1);
Right SubTree μ λν΄μ μκ°ν΄λ³΄λ©΄,
InOrder λ°°μ΄μ μμμ μ root λ Έλμ λ€μλΆν°μΌ κ²μ΄λ€.
InOrder λ°°μ΄μ λμ μ InRight λ‘ λμΌν κ²μ΄λ€.
PostOrder λ°°μ΄μ μμμ μ postLeft μμ leftsubTreeSize λ₯Ό λν κ²μ΄λ€.
postRight λ Root λ Έλλ₯Όμ μΈν PostRight - 1 κΉμ§ μΌ κ²μ΄λ€.
printPreOrder(rootIdx + 1, inRight, postLeft + leftSubtreeSize, postRight - 1);
μΈλ±μ±μ΄ λκ² ν·κ°λ¦¬λλ°(1μ λΉΌμΌ ν μ§ λν΄μΌ ν μ§), κ·Έλ¦Όμ κ·Έλ €λκ³ λ£¨νΈ λ Έλλ₯Ό ν¬ν¨νμ§ μλλ‘ ν΄μΌνλ€λ κ²μ μκ°νλ©΄ λͺ λ²μ μνμ°©μ€λ₯Ό κ±°μ³μ ν΄κ²°ν μ μμ κ²μ΄λ€..! π’
μ 체 μ½λλ μλμ κ°λ€.
import javax.lang.model.SourceVersion;
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int[] inOrder;
static int[] postOrder;
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = Integer.parseInt(br.readLine());
inOrder = new int[100001];
postOrder = new int[100001];
stk = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
inOrder[i] = Integer.parseInt(stk.nextToken());
}
stk = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
postOrder[i] = Integer.parseInt(stk.nextToken());
}
printPreOrder(0, n-1, 0, n-1);
bw.flush();
bw.close();
}
static void printPreOrder(int inLeft, int inRight, int postLeft, int postRight) throws IOException {
if(inLeft > inRight || postLeft > postRight)
return;
int root = postOrder[postRight];
int rootIdx = 0;
for(int i = inLeft; i<=inRight; i++){
if(inOrder[i] == root){
rootIdx = i;
}
}
bw.write(inOrder[rootIdx]+" ");
int leftSubtreeSize = rootIdx - inLeft;
printPreOrder(inLeft, rootIdx - 1, postLeft, postLeft + leftSubtreeSize - 1);
printPreOrder(rootIdx + 1, inRight, postLeft + leftSubtreeSize, postRight - 1);
}
}
'π₯ Algorithm || λ¬Έμ νμ΄ > PS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€ 9019] DSLR μλ°(BFS + κ²½λ‘ μΆμ ) (0) | 2023.06.03 |
---|---|
[λ°±μ€ 1162 λλ‘ν¬μ₯] μλ° (λ€μ΅+DP) (0) | 2023.05.28 |
[νΈλ¦¬μ μ§λ¦ ꡬνκΈ°] λ°±μ€ 1167 (JAVA) - dfs / λ€μ΅μ€νΈλΌ (0) | 2023.03.20 |
[Union and Find] λ°±μ€ 20040 μ¬μ΄ν΄ κ²μ (0) | 2023.03.07 |
[Meet in the middle] λ°±μ€ 1450 λ μ λ¬Έμ (0) | 2023.03.06 |