Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでツリーノードのK番目の祖先を見つけるプログラム


0からn-1までの番号が付けられたn個のノードを持つツリーがあるとします。ツリーは親配列によって与えられます。ここで、parent[i]はノードiの親です。ツリーのルートはノード0です。特定のノードのk番目の祖先を見つける必要があります。祖先が存在しない場合は、-1を返します

したがって、入力が次のような場合

PythonでツリーノードのK番目の祖先を見つけるプログラム

ノード6の最初の祖先が5で、2番目の祖先が2であるため、出力は2になります。

これを解決するには、次の手順に従います-

  • 関数solve()を定義します。これは親、ノード、kを取ります

  • ノードが-1と同じ場合、

    • -1を返す

  • それ以外の場合、kが1と同じ場合、

    • 親を返す[ノード]

  • それ以外の場合、(k AND k-1)がゼロの場合、

    • 戻り値solve(parent、solve(parent、node、quotient of k / 2)、quotient of k / 2)

  • それ以外の場合

    • msb:=2 ^(k -1のビット数)

    • 戻り値solve(parent、solve(parent、node、k-msb)、msb)

理解を深めるために、次の実装を見てみましょう

def solve(parent, node, k):
   if node == -1:
      return -1
   elif k == 1:
      return parent[node]
   elif not (k & k-1):
      return solve(parent, solve(parent, node, k >> 1), k >> 1)
   else:
      msb = 1 << (k.bit_length()-1)
      return solve(parent, solve(parent, node, k-msb), msb)

parent = [-1,0,0,1,2,2,5,5]
node = 6
k = 2
print(solve(parent, node, k))

入力

[6,7,9,16,22], 2

出力

2

  1. Pythonの二分探索木でk番目に小さい要素を見つけるプログラム

    二分探索木があり、別の整数kがあるとすると、ツリー内でk番目に小さい値を見つける必要があります。 したがって、入力が次のような場合 k =3の場合、出力は7になります これを解決するには、次の手順に従います- スタック:=空のスタック i:=0 ans:=-1 スタックが空でないか、ルートがnullでない場合は、実行してください ルートがnullでない場合は、実行してください ルートをスタックにプッシュする ルート:=ルートの左側 v:=スタックから要素をポップ iがkと同じ場合、 ans:=vの値 ループか

  2. Pythonの二分木でk長のパスを見つけるプログラム

    一意の値を含む二分木があり、別の値kもあるとすると、ツリー内のkの長さの一意のパスの数を見つける必要があります。パスは、親から子へ、または子から親へのいずれかになります。一部のノードが一方のパスに表示され、もう一方のパスには表示されない場合、2つのパスは異なると見なされます。 したがって、入力が次のような場合 k =3の場合、パスは[12,8,3]、[12,8,10]、[8,12,15]、[3,8,10]であるため、出力は4になります。 これを解決するために、次の手順に従います- 関数dfs()を定義します。これはノードを取ります ノードがnullの場合、 1とk