여기에 원래 제목 링크 : 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 과
1000
노드. - 각 노드의 값 사이에있을 것입니다
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 }
类似이진 트리 수직 주문 순회 .