문제 설명
이진 트리 감안하면 서 자신을 상상할 권리 , 그것의 측면이 위에서 아래로 정렬 볼 수있는 노드의 값을 반환합니다.
예:
입력 : [1,2,3, NULL, 5, 널 4
출력 : 1, 3, 4]
설명 :
1 <---
/ \
2 3 <---
\ \
5 4 <---
문제 링크
비디오 자습서
여기 상세 비디오 자습서를 찾을 수 있습니다
생각 프로세스
이것은 큰 문제이며 내가보기 엔 우리가 인터뷰에서 나무에 대해 알아야 할 모든 것을 다루고 있기 때문에 우리는 수준의 주문 탐색을위한 DFS와 BFS 모두 그것을 해결하는 것이 좋습니다.
바로 하위 트리가 왼쪽 서브 트리를 커버 할 정도로 깊은되지 않을 것 때문에 더 나은 테스트 케이스가 될 것입니다
1 <--- / \ 2 3 <--- \ 5 <---
[1, 3, 5]
BFS를 사용하여 레벨 순서 탐색 (큐)
우리가 수준 순서 통과를 사용하는 방법에 대해 생각하고 우리는 각 단계에서 요소를 튀어 나올 때 우리는 단순히 대부분의 요소를 큐를 사용하고 항상 권리를 찾을 수있는 것은 상대적으로 자연해야한다.
DFS를 사용하여 레벨 순서 탐색 (지도)
선주문 탐색 방법은 단지지도 DFS를 사용 순서 레벨 탐색 (같은 키 깊이, 노드 값이다). 이 방법은 예약 주문 탐색을 수행하는 동안, 즉 노드 값을 기록, 각 주문의 가장 오른쪽 값을 기록하고 마우스 오른쪽 이동 왼쪽으로 이동하는 값 맵에 깊이를 사용합니다. 이 방법은 오른쪽 값은 항상 따라서 "우측면"를 유지 왼쪽 값을 덮어 쓸 수 있습니다
개인적으로 좋아하지 않는 leetcode 공식 솔루션, 두 스택과에서 필요하지 않습니다 DFS의를
BFS 당신은지도가 필요하지 않습니다.
약 왼쪽에서보기를 구현하는 방법, 후속? 사소한 맞죠?
솔루션
BFS를 사용하여 레벨 순서 탐색 (큐)
1 // 큐와 BFS 2 공개 에서 <정수> rightSideView (TreeNode를 루트) { 3 에서 <정수> = 입술 새로운 ArrayList를 <> (); (4) 만약 (루트 ==의 널 ) { 5 리턴 입술; 6 } 7 8 //가 아닌 큐에 노드를 중시해야 9 큐 <TreeNode를> Q = 새 LinkedList의 <>를 (); 10 q.add (루트); 11 (12) 동안 (! q.isEmpty ()) { 13 INT S =q.size (); 14 // BFS 클래식 템플릿 큐 크기를 기억 현재 레벨 (15) 에 대해 ( int로 I = 0; i가 S를 <; 내가 ++ ) { 16 TreeNode를 t = q.poll (); 17 // 마지막 요소는 우측면도 18 의 경우 (I == S - 1 ) { 19 res.add (t.val); (20) } (21) 의 경우 (! = t.left 널 ) q.offer (t.left); 22 일 경우 (t.right! = null의 ) q.offer (t.right); 23 } 24 } (25) (26) 반환 고해상도; 27 }
시간 복잡도 : O (N) 우리는 한 번 각 노드를 방문하기 때문에
공간 복잡도 : O (N), 마지막 수준에서 요소의 더 정확하게 숫자, 그것은 완전한 나무의 일명 큐 크기
DFS를 사용하여 레벨 순서 탐색 (지도)
1 개인 공극 dfsHelper (MAP <정수 정수> depthToValue, TreeNode를 노드 INT의 깊이) { 2 경우 (노드 == 널 ) { 3 창 ; 4 } 5 6 // 이 선주문 통과 본질적 depthToValue지도를 (우)을 덮어 보관이다 7 // 왼쪽에서 오른쪽으로 트리를 순회하면서 8 depthToValue.put (깊이 node.val); 9 dfsHelper (depthToValue, node.left 깊이 + 1 ); 10 // 오른쪽 재귀 나중에 제공하기 때문에 오른쪽보기를 덮어 11 dfsHelper (depthToValue, node.right 깊이 + 1 ); 12 } 13 14 대중 목록 <정수> rightSideView (TreeNode를 루트) { (15) 지도 <정수, 정수> depthToValue = 새로운 HashMap의 <> (); 16 dfsHelper (depthToValue 루트, 1 ); 17 (18) INT의 깊이 = 1 ; (19) (20) 에서 <정수> = 결과 새로운 ArrayList를 <> (); 21 (22) 동안 (depthToValue.containsKey (깊이)) { 23 result.add (depthToValue.get (깊이)); (24) 깊이 ++ ; 25 } 26 리턴 결과; 27 }
시간 복잡도 : O (N) 우리는 한 번 각 노드를 방문하기 때문에
공간 복잡도 : O (LGN) 우리는 최악의 경우 O 수 나무 높이를해야한다지도와지도 크기를 사용하고 있기 때문에 (N)