티스토리 뷰
[LeetCode - Daily Challenge] 1008. Construct Binary Search Tree from Preorder Traversal
Jaime.Lee 2021. 10. 16. 10:30Problem
Given an array of integers preorder, which represents the preorder traversal of a BST (i.e., binary search tree), construct the tree and return its root.
It is guaranteed that there is always possible to find a binary search tree with the given requirements for the given test cases.
A binary search tree is a binary tree where for every node, any descendant of Node.left has a value strictly less than Node.val, and any descendant of Node.right has a value strictly greater than Node.val.
A preorder traversal of a binary tree displays the value of the node first, then traverses Node.left, then traverses Node.right.
Example 1:
Input: preorder = [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]
Example 2:
Input: preorder = [1,3]
Output: [1,null,3]
Constraints:
- 1 <= preorder.length <= 100
- 1 <= preorder[i] <= 10&8
- All the values of preorder are unique.
Solution
preorder 정수 배열이 주어졌을 때 다시 이진 검색 트리로 복원하는 문제입니다.
이진 검색 트리의 특성을 잘 생각해서 풀어야하는 문제입니다.
먼저 루트 기준으로 왼쪽에는 항상 루트보다 작은 값이 위치해야하고, preorder의 특성상 이 부분까지는 구현하기 매우 쉽습니다.
이전 값보다 현재 값이 높아지는 순간이 left 노드에서 right 노드로 넘어가는 순간인데 이 때 최댓값을 갱신해주지 않으면 숫자 비교를 제대로 할 수 없습니다.
/**
* 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;
* }
* }
*/
public class Solution {
private int index = 0;
public TreeNode bstFromPreorder(int[] preorder) {
return bstFromPreorder(preorder, Integer.MAX_VALUE);
}
private TreeNode bstFromPreorder(int[] preorder, int max) {
if (index == preorder.length || preorder[index] > max) {
return null;
}
TreeNode node = new TreeNode(preorder[index++]);
node.left = bstFromPreorder(preorder, node.val);
node.right = bstFromPreorder(preorder, max);
return node;
}
}
Test
package io.lcalmsky.leetcode.construct_binary_search_tree_from_preorder_traversal;
import io.lcalmsky.leetcode.TreeNode;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void givenPreorder_whenConstructBinarySearchTree_thenCorrect() {
assertAll(
() -> test(new int[]{8, 5, 1, 7, 10, 12}, TreeNode.of(8, 5, 10, 1, 7, null, 12)),
() -> test(new int[]{1, 3}, TreeNode.of(1, null, 3))
);
}
private void test(int[] given, TreeNode expected) {
// when
Solution solution = new Solution();
TreeNode actual = solution.bstFromPreorder(given);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode - Daily Challenge] 309. Best Time to Buy and Sell Stock with Cooldown (0) | 2021.10.18 |
---|---|
[LeetCode - Daily Challenge] 279. Perfect Squares (0) | 2021.10.17 |
[LeetCode - Daily Challenge] 543. Diameter of Binary Tree (0) | 2021.10.15 |
[LeetCode - Daily Challenge] 201. Bitwise AND of Numbers Range (0) | 2021.10.14 |
[LeetCode - Daily Challenge] 208. Implement Trie (Prefix Tree) (0) | 2021.10.10 |
- Total
- Today
- Yesterday
- 스프링 부트
- 스프링 데이터 jpa
- Spring Boot
- leetcode
- Java
- spring boot jwt
- @ManyToOne
- 스프링 부트 회원 가입
- 클린 아키텍처
- 헥사고날 아키텍처
- 알고리즘
- intellij
- Spring Data JPA
- JPA
- Jackson
- 함께 자라기 후기
- spring boot app
- JSON
- 스프링 부트 애플리케이션
- Spring Boot JPA
- Spring Boot Tutorial
- gRPC
- 함께 자라기
- 스프링 부트 튜토리얼
- QueryDSL
- 스프링부트
- Linux
- r
- proto3
- spring boot application
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |