二分木が与えられた場合、同じ垂直線にあるノードの垂直方向の合計を見つけます。すべての合計を異なる垂直線に出力します。
同じ垂直線とは何かを理解するには、まず水平距離を定義する必要があります。2 つのノードの水平距離 (HD) が同じ場合、それらは同じ垂直線上にあります。HD の考え方は単純です。ルートの HD は 0 で、右端 (右のサブツリーに接続する端) は +1 水平距離と見なされ、左端は -1 水平距離と見なされます。たとえば、上のツリーでは、ノード 4 の HD は -2、ノード 2 の HD は -1、ノード 5 と 6 の HD は 0、ノード 7 の HD は +2 です。
例:
1
/ \
2 3
/ \ / \
4 5 6 7
ツリーには 5 つの垂直線があります
Vertical-Line-1 にはノード 4 が 1 つしかありません => 垂直方向の合計は 4 です
Vertical-Line-2: ノード 2 が 1 つしかない => 垂直方向の合計は 2
Vertical-Line-3: 3 つのノードがあります: 1,5,6 => 垂直合計は 1+5+6 = 12
Vertical-Line-4: ノード 3 が 1 つしかない => 垂直方向の合計は 3
Vertical-Line-5: ノード 7 が 1 つしかない => 垂直方向の合計は 7
したがって、期待される出力は 4、2、12、3、および 7 です。
私の解決策: この問題の ao(nlong(n)) 解決策を考えます。アイデアは次のとおりです。
(1) preorder トラバーサルを使用してすべてのノードの HD を取得し、HD とそれに関連付けられたノードを配列に格納します。
(2) 配列を HD で並べ替える
(3) ソートされた配列を走査して結果を出力します。
これは、この問題に最適なものではないと確信しています。より良い解決策を教えてくれる人はいますか?