トピック:
リンク:https://leetcode-cn.com/problems/binary-tree-vertical-order-traversal/、
バイナリツリーのノードに戻り、所与の 垂直方向のトラバースの値(行によって上から下へ、行)。
同一の行および列内の2つのノード場合、それが正しい順序に放置しました。
例1:
入力:[3,9,20,null,null,15,7]
3
/ \
/ \
920
/ \
/ \
157
出力:
[
[9]、
[3,15]、
[20]、
[7]
]
例2:
入力:[3,9,8,4,0,1,7]
3
/ \
/ \
98
/ \ / \
/ \ / \
4017
出力
:
[ [4]、
[9]、
[3,0,1]、
[8]、
[7]
]
例3:
入力:[3,9,8,4,0,1,7,null,null,null,2,5](注意:
右の子ノードが左の子ノード0 2,1 5)であり、 3 / \ / \ 98 / \ / \ / \ / \ 4017 / \ / \ 52 :出力 [ [4] 、[9,5]、 [3,0,1]、 [8,2]、 [7] ]
回答:
最近、春動くすべてのC ++コンピュータ・ネットワーク・オペレーティング・システムを処理するために準備された、質問を磨くなかった長い時間のために持っているし、その後緩やかな問題は通常、関連するとレベルを通過する必要があり、長い時間のために考えたくはありませんされていますが、具体的なアイデアをされていない持っています。いきなり答えを実現し、他の人々を読みます
横ノードの最終的な位置を示す垂直トラバースは、これは一般的に意味してもよいです。
大小規模から深さが、そうBFSレベルをトラバース考えます。最初のいくつかの層トラバーサルので、その後、より自然な条件が満たされるにはあまりから層、深さの多数を横切ります。
もちろん、DFSを使用してもよいが、パラメータDFSは軽い表示最終ノードの最終行に、より深い前部横断ノードを防止するために、層の現在の数を保存します。
また、子どもたちに参加する各列の左から右へ、限り、我々は階層順を横断するこのの制限として、右にも左から同じ行に残されており、右の子供たちは、この制約を満たすために。
BFSコード:
/ * * *バイナリツリーノードの定義。 *構造体のTreeNode { * INTヴァル。 *のTreeNode *左; *のTreeNode *右; *ツリーノード(INT X):ヴァル(x)は、左(NULL)、右(NULL){} *}。 * / クラスソリューション{ パブリック: ベクトル <ベクトル< INT >> verticalOrder(ツリーノード* ルート){ 場合(ルート== nullptr){ リターン{}。 } ベクトル <ベクトル< 整数 >> RES。 マップ < int型、ベクトル< int型>> メモ。 キュー <TreeNodeの*> data_queue。 キュー < 整数 > coordinate_queue。 data_queue.push(ルート)。 (coordinate_queue.push 0 )。 ツリーノード * CUR = nullptr; int型cur_coor; 一方、(ないdata_queue.empty()){ CUR = data_queue.front()、cur_coor = coordinate_queue.front()。 data_queue.pop())(coordinate_queue.pop。 メモ[cur_coor] .emplace_back(CUR - >ヴァル)// CUR的值记录在横坐标为cur_coor的数组中 であれば(cur->左){ data_queue.push(CUR - > 左)。 coordinate_queue.push(cur_coor - 1 )。 } であれば(cur-> 右){ data_queue.push(CUR - > 右)。 coordinate_queue.push(cur_coor + 1 )。 } } のための(自動&ペア:メモ){ res.emplace_back(ムーブ(pair.second))。 } 戻りRES。 } }。