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