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

Pythonでツリー内の特別なノードを見つけるプログラム


n-aryツリーを表す「tree」と呼ばれる値の2Dリストと、「color」と呼ばれる別の値のリストがあるとします。ツリーは隣接リストとして表され、そのルートはtree[0]です。

i番目のノードの特性-

  • tree[i]はその子であり親です。

  • color[i]はその色です。

ルートがNにあるサブツリー内のすべてのノードが一意の色を持っている場合、ノードNを「特別」と呼びます。このツリーがあるので、特別なノードの数を調べる必要があります。

So, if the input is like tree = [
   [1,2],
   [0],
   [0,3],
   [2]
]
のような場合

色=[1、2、1、1]の場合、出力は2になります。

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

  • 結果:=0

  • dfs(0、-1)

  • 結果を返す

  • 関数check_intersection()を定義します。これは色を取ります、child_colors

    • (colors)の長さ<(child_colors)の長さの場合、

      • 色のcごとに、実行します

        • child_colorsのcがゼロ以外の場合、

          • Trueを返す

    • それ以外の場合

      • child_colorsのcごとに、実行します

        • cがchild_colorsに存在する場合、

          • Trueを返す

  • 関数dfs()を定義します。これはノードを取ります、前へ

    • 色:={color [node]}

    • tree [node]の子ごとに、実行

      • 子供が前と同じでない場合は、

        • child_colors:=dfs(child、node)

        • 色とchild_colorsが空でない場合は、

          • check_intersection(colors、child_colors)がゼロ以外の場合、

            • 色:=null

          • それ以外の場合

            • (colors)の長さ<(child_colors)の長さの場合、

              • child_colors:=child_colorsまたはcolors

              • 色:=child_colors

            • それ以外の場合

              • 色:=色またはchild_colors

        • それ以外の場合

          • 色:=null

      • 色が空でない場合は、

        • 結果:=結果+ 1

      • 戻り色

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

import collections
class Solution:
   def solve(self, tree, color):
      self.result = 0
      def dfs(node, prev):
         colors = {color[node]}
         for child in tree[node]:
            if child != prev:
               child_colors = dfs(child, node)
               if colors and child_colors:
                  if self.check_intersection(colors, child_colors):
                     colors = None
                  else:
                     if len(colors) < len(child_colors):
                        child_colors |= colors
                        colors = child_colors
                     else:
                        colors |= child_colors
                  else:
                     colors = None
            if colors:
               self.result += 1
            return colors
         dfs(0, -1)
         return self.result
      def check_intersection(self, colors, child_colors):
         if len(colors) < len(child_colors):
            for c in colors:
               if c in child_colors:
                  return True
         else:
            for c in child_colors:
               if c in colors:
                  return True
ob = Solution()
print(ob.solve( [
   [1,2],
   [0],
   [0,3],
   [2]
], [1, 2, 1, 1]))

入力

[
   [1,2],
   [0],
   [0,3],
   [2]
], [1, 2, 1, 1]

出力

2

  1. Pythonでn-aryツリーの直径を見つけるプログラム

    仮に、n-aryツリーが与えられ、ツリーの直径を決定すると言われているとします。ツリーの直径は、ツリーの任意の2つのリーフノード間に存在する最長のパスです。木の直径を表す整数値を見つけて返す必要があります。 したがって、入力が次のような場合 その場合、出力は3になります。 65で構成されます(図では赤い線でマークされています)。パスの長さは3です。 これを解決するには、次の手順に従います- ans:=1 関数depth()を定義します。これが定着します ルートが空でない場合は、 0を返す 子:=値0、0を含む新しいリスト temp_chil

  2. Pythonでn-aryツリーのルートを見つけるプログラム

    配列内のn-aryツリーのノードが与えられたとします。ツリーを再構築して、ツリーのルートノードを見つけて返す必要があります。返されたノードから、ツリー全体をプレオーダー表記で表示する必要があります。 したがって、入力が次のような場合 その場合、出力は次のようになります [14, 27, 32, 42, 56, 65] ツリーのルートを使用して、ツリーのプレオーダートラバーサルを表示します。したがって、出力はツリーのプレオーダートラバーサルです。 これを解決するには、次の手順に従います- indegree:=整数値を含む新しいマップ ツリー内のノードごとに、実行します