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

Pythonのn-aryツリーで最長のパスの長さを見つけるプログラム


各アイテムが保持しているエッジリスト(u、v)があり、uがvの親であることを表しているとします。ツリー内で最も長いパスの長さを見つける必要があります。パスの長さは、1+そのパス内のノードの数です。

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

Pythonのn-aryツリーで最長のパスの長さを見つけるプログラム

パスが[1、4、5、7]であり、合計4つのノードがあるため、出力は5になります。したがって、パスの長さは1 + 4=5です。

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

  • g:=指定されたエッジリストからのグラフの隣接リスト
  • d:=新しい地図
  • 関数bfs()を定義します。これには時間がかかります
  • d [o]:=1
  • f:=o
  • q:=[o]
  • qの各xについて、
    • g [x]のyごとに、
      • yがdにない場合、
        • d [y]:=d [x] + 1
        • d [y]> d [f]の場合、
          • f:=y
        • qにyを挿入
  • return f
  • メインの方法から、次の手順を実行します-
  • gの各oについて、
    • f:=bfs(o)
    • d:=新しい地図
    • return d [bfs(f)]
  • 0を返す

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

def solve(edges):
   g = {}
   for u, v in edges:
      if u not in g:
         g[u] = []
      g[u] += (v,)
      if v not in g:
         g[v] = []
      g[v] += (u,)
   d = {}

   def bfs(o):
      d[o] = 1
      f = o
      q = [o]
      for x in q:
         for y in g[x]:
            if y not in d:
               d[y] = d[x] + 1
               if d[y] > d[f]:
                  f = y
               q += (y,)
      return f

   for o in g:
      f = bfs(o)
      d = {}
      return d[bfs(f)]
   return 0

edges = [(1, 2),(1, 3),(1, 4),(4, 5),(5,7),(1,6),(4,8)]
print(solve(edges))

入力

[(1, 2),(1, 3),(1, 4),(4, 5),(5,7),(1,6),(4,8)]

出力

5

  1. Pythonでバイナリツリーのルートからリーフまでの最長の合計パスの合計を見つけるプログラム

    二分木があるとすると、ルートからリーフノードまでの最長パスの合計を見つける必要があります。同じ長いパスが2つある場合は、合計が大きいパスを返します。 したがって、入力が次のような場合 その場合、出力は20になります。 これを解決するには、次の手順に従います- 関数rec()を定義します。これには時間がかかります currがnullの場合、 return(0、0) 大きい:=rec(currの左側)の最大値、rec(currの右側) ペアを返します(bigger [0] + 1、bigger [1] + currの値) メインの方法から、次のよ

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

    二分木があるとすると、ツリー内の任意の2つのノード間の偶数の値で構成される最長のパスを見つける必要があります。 したがって、入力が次のような場合 最長のパスが[10、2、4、8、6]であるため、出力は5になります。 これを解決するには、次の手順に従います- ans:=0 関数find()を定義します。これはノードを取ります ノードがnullの場合、 戻り値(-1、-1) leftCnt:=find(ノードの左側)の戻り値の最大値+ 1 rightCnt:=find(ノードの右側)の戻り値の最大値+ 1 ノードの値が偶数の場合、