티스토리 뷰
Algorithm/LeetCode
[LeetCode - Daily Challenge] 106. Construct Binary Tree from Inorder and Postorder Traversal
Jaime.Lee 2021. 11. 24. 10:30Problem
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 same tree, construct and return the binary tree.
Example 1:
Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
Output: [3,9,20,null,null,15,7]
Example 2:
Input: inorder = [-1], postorder = [-1]
Output: [-1]
Constraints:
- 1 <= inorder.length <= 3000
- postorder.length == inorder.length
- -3000 <= inorder[i], postorder[i] <= 3000
- inorder and postorder consist of unique values.
- Each value of postorder also appears in inorder.
- inorder is guaranteed to be the inorder traversal of the tree.
- postorder is guaranteed to be the postorder traversal of the tree.
Solution
inorder와 postorder로 구성된 배열이 주어질 때 실제 이진 트리를 구성하는 문제입니다.
postorder의 마지막 원소는 구성할 트리의 루트 원소입니다.
inorder의 경우 root 원소를 기준으로 왼쪽 원소들이 해당 노드의 left를 구성하게 될 것이고, 오른쪽 원소들이 해당 노드의 right를 구성하게 될 것입니다.
이런 작업을 반복해서 진행해나가면 이진 트리를 구성할 수 있게 됩니다.
public class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTree(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
}
public TreeNode buildTree(int[] inorder, int inorderLeft, int inorderRight,
int[] postorder, int postorderLeft, int postorderRight) {
if (inorderLeft > inorderRight || postorderLeft > postorderRight) {
return null;
}
int rootValue = postorder[postorderRight]; // (1)
TreeNode root = new TreeNode(rootValue); // (1)
int rootIndexOfInorder = getRootIndexOfInorder(inorder, rootValue); // (2)
root.left = buildTree(inorder, inorderLeft, rootIndexOfInorder - 1,
postorder, postorderLeft, postorderLeft + rootIndexOfInorder - (inorderLeft + 1)); // (3)
root.right = buildTree(inorder, rootIndexOfInorder + 1, inorderRight,
postorder, postorderLeft + rootIndexOfInorder - inorderLeft, postorderRight - 1); // (4)
return root; // (5)
}
private int getRootIndexOfInorder(int[] inorder, int rootValue) {
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == rootValue) {
return i;
}
}
throw new IllegalStateException();
}
}
- postorder의 마지막 원소(현재 기준)는 root 노드의 값이 됩니다.
- 1번에서 찾은 root 노드의 값으로 inorder에서 몇 번째 위치하는지 찾습니다.
- 현재 노드(root)의 왼쪽 노드를 재귀 호출로 만듧니다. 이 때 inorder의 범위는 root 노드 전까지, postorder의 범위는 inorder의 갯수만큼 입니다.
- 현재 노드(root)의 오른쪽 노드를 재귀호출로 만듭니다. 이 때 inorder의 범위는 root 노드 다음부터 끝까지, postorder의 범위는 inorder의 갯수만큼부터 루트 노드를 제외한 끝까지 입니다.
- 1번에서 생성한 루트 노드를 반환합니다.
Test
package io.lcalmsky.leetcode.construct_binary_tree_from_inorder_and_postorder_traversal;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import io.lcalmsky.leetcode.TreeNode;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
void givenInorderAndPostorder_whenBuildTree_theCorrect() {
assertAll(
() -> test(new int[]{9, 3, 15, 20, 7}, new int[]{9, 15, 7, 20, 3},
TreeNode.of(3, 9, 20, null, null, 15, 7))
);
}
private void test(int[] inorder, int[] postorder, TreeNode expected) {
// when
Solution constructBinaryTreeFromInorderAndPostorderTraversal = new Solution();
TreeNode actual = constructBinaryTreeFromInorderAndPostorderTraversal.buildTree(inorder,
postorder);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode - Daily Challenge] 35. Search Insert Position (0) | 2021.11.27 |
---|---|
[LeetCode - Daily Challenge] 53. Maximum Subarray (0) | 2021.11.26 |
[LeetCode - Daily Challenge] 450. Delete Node in a BST (0) | 2021.11.23 |
[LeetCode - Daily Challenge] 540. Single Element in a Sorted Array (0) | 2021.11.22 |
[LeetCode - Daily Challenge] 461. Hamming Distance (0) | 2021.11.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스프링 부트
- gRPC
- Jackson
- 스프링 부트 튜토리얼
- JSON
- QueryDSL
- r
- 헥사고날 아키텍처
- spring boot application
- leetcode
- Spring Boot Tutorial
- spring boot app
- 스프링부트
- @ManyToOne
- 함께 자라기
- proto3
- Spring Data JPA
- JPA
- 클린 아키텍처
- 함께 자라기 후기
- 스프링 부트 애플리케이션
- Spring Boot JPA
- Java
- spring boot jwt
- intellij
- 스프링 데이터 jpa
- Linux
- 스프링 부트 회원 가입
- 알고리즘
- Spring Boot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함