正確なアルゴリズムの1つは、次のとおりです。
リーフから開始し、ばらばらのグラフ(実際にはすべてK1)を作成し、各ステップでこのリーフの親を見つけて、新しいツリーにマージします。ノードx
にr
既知の子があり、ノードの次数がj
単純j = r+1
にの子ノードにないノードはx
、この場合は現在のノードの親であり、そうでない場合は、関連するルート化されたサブツリーが構築されないような子があります。この場合、ノードはです。x
nice
x
bad
したがって、各ステップでnice
ノードを関連する親に接続します。各ステップでsum of {degree of parent nice nodes}
も、少なくとも1つの適切なノードがあることは明らかです(リーフから開始するため)。したがって、アルゴリズムはO(n)であり、実行されます。完全に、しかし削除されるべきノードを見つけるために、実際には各ステップで二結合リスト(サブツリーリスト)のサイズをチェックする必要があります、これは構築中のO(1)で行うことができます、またリストのサイズが等しい場合またはn/2より大きい場合は、関連するniceノードを選択します。(実際、この条件を満たす最小リストで素敵なノードを見つけてください)。
明らかなことは、ツリーを適切に分割できる場合(各部分には最大でn / 2のノードがあります)、このアルゴリズムで実行できますが、そうでない場合(実際には、ツリーを2つ以上の部分に分割することはできません) n / 2よりも小さいサイズ)これにより、適切な近似値が得られます。また、ご覧のとおり、入力ツリーには仮定がありません。
注:1つのノードを削除しても、n/2よりも小さいサイズの一部に分割できないようなツリーを作成できるかどうかはわかりません。