바 오즈 Leetcode 솔루션 199 : 이진 트리 우측 모습

문제 설명 

 

이진 트리 감안하면 서 자신을 상상할  권리  , 그것의 측면이 위에서 아래로 정렬 볼 수있는 노드의 값을 반환합니다.

예:

입력 : [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)

참조

추천

출처www.cnblogs.com/baozitraining/p/11595617.html