이진 트리 이진 트리 수직 주문 순회의 LeetCode 987 수직 주문 순회

여기에 원래 제목 링크 : https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/

주제 :

이진 트리를 지정하면, 반환  수직 주문  의 노드 값의 통과를.

위치의 각 노드에 대해  (X, Y), 그 좌우 아이들은 각각의 위치에있을 것입니다  (X-1, Y-1) 및  (X+1, Y-1).

에서 수직선을 실행  X = -infinity 에  X = +infinity수직 라인이 일부 노드에 닿을 때마다, 우리는 위에서 아래로 (감소하기 위해 노드의 값을보고  Y 좌표).

두 개의 노드가 같은 위치에있는 경우에, 처음보고 된 노드의 값이 작은 값입니다.

의 순서대로 비어 있지 않은 보고서의리스트를 돌려줍니다  X 좌표입니다. 모든 보고서는 노드의 값 목록을해야합니다.

예 1 :

입력 : [3,9,20, NULL, NULL, 15,7] 
출력 : [[9], [3,15], [20], [7]] 
설명 : 
일반성의 손실없이, 우리는 루트를 가정 할 수있다 노드 위치 (0, 0) 
그 후, 값 9 노드 (-1 -1) 위치에서 발생한다; 
값 (3)과 (15)의 노드는 (0, -2)의 위치 (0, 0)에서 발생; 
값 (20)와 노드 (1, -1) 위치에서 발생한다; 
값 7 노드 (2-2) 위치에서 발생한다.

예 2 :

입력 : [1,2,3,4,5,6,7] 
출력 : [4], [2], [1,5,6], [3], [7] 
설명 : 
값을 가진 노드 도 5 및 6의 값을 가진 노드는 소정의 방식에 따라 동일한 위치를 갖는다. 
(5) (6)보다 작기 때문에 그러나, 보고서 "[1,5,6]는"5의 노드 값은 제 온다.

노트 :

  1. 나무 사이에있을 것이다  1  과  1000 노드.
  2. 각 노드의 값 사이에있을 것입니다  0 및  1000.

해결 방법 :

수직 위해, 우리는 열 등의 키를 유지하기는 HashMap이 필요합니다.

동일한 열이있을 때, 그들은 같은 값 수집에 투입되어야한다.

여기에 동일한 열 및 같은 행에 하나 개 더 추가 제약 조건이다, 더 작은 값이 먼저왔다.

HashMap의 나오는 경우 따라서, 정렬 값이 첫 번째 행에 기초하여, 다음의 값에 기초하여.

시간 복잡도 : O (logn + N * loglogn). 여기서 n은 노드의 수입니다. 따라서, 긴 목록 트리 m = logn의 높이이다. 정렬한다 O (mlogm).

공간 : O (N).

AC 자바 : 

1  / ** 
2  이진 트리 노드에 대한 * 정의.
3  * 공용 클래스의 TreeNode {
 4  * INT 브로;
5  * TreeNode에 남음;
6  * TreeNode를 오른쪽;
7  *의 TreeNode INT (X) {X = 브로; }
 8  *}
 9   * / 
10  클래스 해결 {
 11      공개 목록 <일람 <정수 >> verticalTraversal (TreeNode를 루트) {
 12          일람 <일람 <정수 >> 입술 = 새로운 ArrayList를 <> ();
13          의 경우 (루트 == ) {
 14              반환 입술;
15          }
 16          
17          HashMap에 <정수 일람 <쌍 >> HM =  의 HashMap <> ();
18          LinkedList의 <쌍> 케 =  LinkedList의 <> ();
19          (que.add 새로운 쌍 (0, 0 , 루트));
20          INT의 분 = 0 ;
21          INT의 최대 = 0 ;
22          
(23)          동안 (! que.isEmpty ()) {
 24              쌍 CUR = que.poll ();
25              분 = Math.min (분 cur.x)를;
(26)              최대 =Math.max (최대, cur.x);
27              hm.putIfAbsent (cur.x, 새로운 ArrayList를 <> ());
28              hm.get (cur.x)은 (현재)을 .add;
(29)              
(30)              의 경우 (cur.node.left =! ) {
 31                  que.add ( 새로운 쌍 (cur.x-1 cur.y-1 , cur.node.left));
32              }
 33              
34              경우 (cur.node.right =! ) {
 35                  que.add ( 새로운 쌍 (cur.x + 1 cur.y-1 , cur.node.right));
36              }
 37          }
 38         
39           ( INT I = 분; 나는 <최대 =; I ++ ) {
 40              일람 <쌍> 목록 = hm.get (I);
41              은, Collections.sort (목록, (a, b) -> (AY) == 의해 a.node.val-b.node.val : 부산물 AY);
(42)              
(43)              에서 <정수> 항목 = 새로운 ArrayList를 <> ();
44              (쌍 P리스트) {
 45                  (p.node.val) item.add;
46              }
 47              
48              res.add (항목);
49          }
 50          
51          복귀 입술;
52      }
 53 }
 54  
55 개  클래스 쌍 {
 56      의 INT (X);
(57)      INT (Y);
58      의 TreeNode 노드;
59      공공 쌍 ( INT의 X, INT (Y)의 TreeNode 노드) {
 60           .x를 = X;
61           .Y = Y;
62           .node = 노드;
63      }
 64      
65      공중 문자열 toString () {
 66           ","+  .x를 + "^"+  .Y + "^"+ .node.val;
67      }
 68 }

类似이진 트리 수직 주문 순회 .

추천

출처www.cnblogs.com/Dylan-Java-NYC/p/12014476.html