File tree 5 files changed +157
-0
lines changed
binary-tree-maximum-path-sum
maximum-depth-of-binary-tree
5 files changed +157
-0
lines changed Original file line number Diff line number Diff line change
1
+ # Definition for a binary tree node.
2
+ # class TreeNode:
3
+ # def __init__(self, val=0, left=None, right=None):
4
+ # self.val = val
5
+ # self.left = left
6
+ # self.right = right
7
+
8
+ """
9
+ Solution: DFS
10
+ 1) dfs 로 left, right 각각의 max 값을 구한다.
11
+ 2) maxSum 을 업데이트하고,
12
+ 3) return value 로는 leftMax 또는 rightMax 와의 합만 리턴한다.
13
+ (left, right 를 둘 다 포함하는 경우와 둘 중 하나만 선택하는 경우를 나눔)
14
+
15
+ Time: O(n)
16
+ Space: O(n)
17
+
18
+ """
19
+
20
+
21
+ class Solution :
22
+ def maxPathSum (self , root : Optional [TreeNode ]) -> int :
23
+ maxSum = root .val
24
+
25
+ def dfs (root ):
26
+ nonlocal maxSum
27
+ if not root :
28
+ return 0
29
+
30
+ leftMax = dfs (root .left )
31
+ rightMax = dfs (root .right )
32
+ leftMax = max (leftMax , 0 )
33
+ rightMax = max (rightMax , 0 )
34
+
35
+ maxSum = max (maxSum , root .val + leftMax + rightMax )
36
+ return root .val + max (leftMax , rightMax )
37
+
38
+ dfs (root )
39
+ return maxSum
Original file line number Diff line number Diff line change
1
+ """
2
+ Conditions of Valid Tree
3
+ 1) no Loop
4
+ 2) all nodes has to be connected
5
+ """
6
+
7
+
8
+ class Solution :
9
+ def validTree (self , n : int , edges : List [List [int ]]) -> bool :
10
+ if not n :
11
+ return True
12
+
13
+ # Make Graph
14
+ graph = {i : [] for i in range (n )}
15
+ for n1 , n2 in edges :
16
+ graph [n1 ].append (n2 )
17
+ graph [n2 ].append (n1 )
18
+
19
+ # loop check
20
+ visit = set ()
21
+
22
+ def dfs (i , prev ):
23
+ if i in visit :
24
+ return False
25
+
26
+ visit .add (i )
27
+ for j in graph [i ]:
28
+ if j == prev :
29
+ continue
30
+ if not dfs (j , i ):
31
+ return False
32
+ return True
33
+
34
+ return dfs (0 , None ) and n == len (visit )
Original file line number Diff line number Diff line change
1
+ """
2
+ Solution: BFS
3
+ Time: O(n)
4
+ Space: O(n)
5
+ """
6
+
7
+
8
+ class Solution :
9
+ def maxDepth (self , root : Optional [TreeNode ]) -> int :
10
+ if not root :
11
+ return 0
12
+
13
+ q = deque ([root ])
14
+ maxLevel = 0
15
+ while q :
16
+ maxLevel += 1
17
+ for i in range (len (q )):
18
+ node = q .popleft ()
19
+ if node .left :
20
+ q .append (node .left )
21
+ if node .right :
22
+ q .append (node .right )
23
+ return maxLevel
Original file line number Diff line number Diff line change
1
+ """
2
+ Time: O(n log(n))
3
+ Space: O(n)
4
+ """
5
+
6
+
7
+ class Solution :
8
+ def merge (self , intervals : List [List [int ]]) -> List [List [int ]]:
9
+ intervals .sort (key = lambda x : x [0 ])
10
+ result = [intervals [0 ]]
11
+
12
+ for start , end in intervals [1 :]:
13
+ prev = result [- 1 ]
14
+
15
+ if prev [0 ] <= start <= prev [1 ]:
16
+ result [- 1 ][1 ] = max (prev [1 ], end )
17
+ else :
18
+ result .append ([start , end ])
19
+ return result
Original file line number Diff line number Diff line change
1
+ """
2
+ 가장 뒤부터 돌아오는 방법을 찾아야한다.
3
+ 1) 재귀 스택 방식
4
+ 2) 새로운 리스트를 만드는 방법
5
+ 3) two pointer 로 반 잘라서 reverse 한 뒤 merge
6
+ """
7
+
8
+ """
9
+ Solution: 3) Two pointer
10
+ Time: O(n)
11
+ Space: O(1)
12
+ """
13
+
14
+
15
+ class Solution :
16
+ def reorderList (self , head : Optional [ListNode ]) -> None :
17
+
18
+ # 절반 자르기
19
+ slow , fast = head , head .next
20
+ while fast and fast .next :
21
+ slow = slow .next
22
+ fast = fast .next .next
23
+
24
+ # Reverse
25
+ second = slow .next
26
+ slow .next = None
27
+ prev = None
28
+ while second :
29
+ tmp = second .next
30
+ second .next = prev
31
+ prev = second
32
+ second = tmp
33
+
34
+ # Merge
35
+ first = head
36
+ second = prev
37
+ while second :
38
+ tmp1 , tmp2 = first .next , second .next
39
+ first .next = second
40
+ second .next = tmp1
41
+ first = tmp1
42
+ second = tmp2
You can’t perform that action at this time.
0 commit comments