ここでのオリジナルタイトルリンク: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
座標)。
2つのノードが同じ位置を有する場合には、最初に報告されているノードの値が小さい値です。
以下のために、非空のレポートのリストを返し X
座標。すべてのレポートでは、ノードの値のリストを持っています。
例1:
入力:[3,9,20、NULL、NULL、15,7]
出力:[[9]、[3,15]、[20]、[7]]
説明:
一般性を失うことなく、我々はルートを取ることができますノードは、位置(0、0)である。
そして、値9のノード位置で起こる(-1、-1)。
値は3と15(0、0)の位置で発生すると(0、-2)を持つノード。
値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(N + LOGN * loglogn)。Nはノードの数です。したがって最長リストはツリーM = LOGNの高さです。ソートかかるO(mlogm)。
スペース:O(n)を。
ACのJava:
1 / ** 2 分木のノードのための*の定義。 3 *パブリッククラスツリーノード{ 4 * INTヴァル。 5 *のTreeNodeは左。 6 *のTreeNode右; 7 *ツリーノード(INT X){ヴァル= X。} 8 *} 9 * / 10 クラスソリューション{ 11 公衆リスト<リスト<整数>> verticalTraversal(ツリーノードルート){ 12 リスト<リスト<整数>> RES = 新規のArrayList <> (); 13 であれば(ルート== NULL ){ 14の リターンRES。 15 } 16 17 のHashMap <整数、一覧<ペア>> HM = 新規 HashMapの<> (); 18 のLinkedList <ペア> QUE = 新しい 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)は(CUR)を.add。 29 30 であれば(cur.node.left!= NULL ){ 31 que.add(新しいペア(cur.x-1、cur.y-1 、cur.node.left))。 32 } 33 34 であれば(cur.node.right!= NULL ){ 35 que.add(新しいペア(cur.x + 1、cur.y-1 、cur.node.right))。 36 } 37 } 38 39 のために(INT I =分; I <= maxの; I ++ ){ 40 リスト<ペア>リスト= hm.get(I)。 41 Collections.sort(リスト、(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 戻りRES。 52 } 53 } 54 55 クラス対{ 56 のint X; 57 INT Y。 58 ツリーノードのノード。 59 公衆ペア(int型のx、int型Y、ツリーノードのノード){ 60 この .X = X。 61 この .Y = Y。 62 この .nodeファイル= ノード。 63 } 64 65 公共の文字列のtoString(){ 66 リターン "" + この .X + "^" + この .Y + "^" + この.node.val。 67 } 68 }