File tree Expand file tree Collapse file tree 3 files changed +119
-0
lines changed
kth-smallest-element-in-a-bst
lowest-common-ancestor-of-a-binary-search-tree Expand file tree Collapse file tree 3 files changed +119
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * 중간에 새로운 구간 추가하기
3
+ * 알고리즘 복잡도
4
+ * - 시간 복잡도: O(n)
5
+ * - 공간 복잡도: O(n)
6
+ * @param intervals
7
+ * @param newInterval
8
+ */
9
+ function insert ( intervals : number [ ] [ ] , newInterval : number [ ] ) : number [ ] [ ] {
10
+ if ( intervals . length === 0 ) return [ newInterval ]
11
+ let result : number [ ] [ ] = [ ]
12
+
13
+ let i = 0 ;
14
+
15
+ // 1. newIntervals 이전 구간 추가
16
+ while ( i < intervals . length && intervals [ i ] [ 1 ] < newInterval [ 0 ] ) {
17
+ result . push ( intervals [ i ] )
18
+ i ++
19
+ }
20
+
21
+ // 2. 겹치는 부분 추가
22
+ const merged = [ ...newInterval ]
23
+ while ( i < intervals . length && intervals [ i ] [ 0 ] <= newInterval [ 1 ] ) {
24
+ merged [ 0 ] = Math . min ( merged [ 0 ] , intervals [ i ] [ 0 ] )
25
+ merged [ 1 ] = Math . max ( merged [ 1 ] , intervals [ i ] [ 1 ] )
26
+ i ++
27
+ }
28
+ result . push ( merged )
29
+
30
+ // 3. 이후의 구간 추가
31
+ while ( i < intervals . length ) {
32
+ result . push ( intervals [ i ] )
33
+ i ++
34
+ }
35
+
36
+ return result
37
+ }
38
+
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Definition for a binary tree node.
3
+ * class TreeNode {
4
+ * val: number
5
+ * left: TreeNode | null
6
+ * right: TreeNode | null
7
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8
+ * this.val = (val===undefined ? 0 : val)
9
+ * this.left = (left===undefined ? null : left)
10
+ * this.right = (right===undefined ? null : right)
11
+ * }
12
+ * }
13
+ */
14
+ /**
15
+ * Binary Search Tree 특성을 고려하여 k번째 작은 숫자를 찾기
16
+ * 알고리즘 복잡도
17
+ * - 시간 복잡도: O(n)
18
+ * - 공간 복잡도: O(n)
19
+ */
20
+ function kthSmallest ( root : TreeNode | null , k : number ) : number {
21
+ let count = 0 ;
22
+ let result = 0 ;
23
+
24
+ /*
25
+ BST의 특성
26
+ - 왼쪽 서브트리의 노드 값 < 현재 노드 값
27
+ - 현재 노드값 < 왼쪽 서브트리의 노드 값
28
+ => 중위 순회시 오름차 순 방문
29
+ */
30
+
31
+ // 중위 순회 함수
32
+ function inorder ( node : TreeNode | null ) : void {
33
+ if ( node === null ) return ;
34
+ inorder ( node . left ) ;
35
+
36
+ count ++ ;
37
+ if ( count === k ) {
38
+ result = node . val ;
39
+ return ;
40
+ }
41
+
42
+ inorder ( node . right ) ;
43
+ }
44
+
45
+ inorder ( root ) ;
46
+ return result ;
47
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Definition for a binary tree node.
3
+ * class TreeNode {
4
+ * val: number
5
+ * left: TreeNode | null
6
+ * right: TreeNode | null
7
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8
+ * this.val = (val===undefined ? 0 : val)
9
+ * this.left = (left===undefined ? null : left)
10
+ * this.right = (right===undefined ? null : right)
11
+ * }
12
+ * }
13
+ */
14
+ /**
15
+ * BST 이진트리에 두 노드가 주어졌을 때, 근접한 부모 찾기
16
+ * 알고리즘 복잡도
17
+ * - 시간 복잡도: O(n)
18
+ * - 공간 복잡도: O(n)
19
+ * @param root
20
+ * @param p
21
+ * @param q
22
+ */
23
+ function lowestCommonAncestor ( root : TreeNode | null , p : TreeNode | null , q : TreeNode | null ) : TreeNode | null {
24
+ if ( root === null || p === null || q === null ) return null ;
25
+
26
+ if ( p . val < root . val && q . val < root . val ) {
27
+ return lowestCommonAncestor ( root . left , p , q )
28
+ } else if ( p . val > root . val && q . val > root . val ) {
29
+ return lowestCommonAncestor ( root . right , p , q )
30
+ } else {
31
+ // 현재 노드가 양쪽 방향으로 있거나 현재 노드가 p, q인 경우
32
+ return root
33
+ }
34
+ }
You can’t perform that action at this time.
0 commit comments