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
-
Pythonでn-aryツリーの直径を見つけるプログラム
仮に、n-aryツリーが与えられ、ツリーの直径を決定すると言われているとします。ツリーの直径は、ツリーの任意の2つのリーフノード間に存在する最長のパスです。木の直径を表す整数値を見つけて返す必要があります。 したがって、入力が次のような場合 その場合、出力は3になります。 65で構成されます(図では赤い線でマークされています)。パスの長さは3です。 これを解決するには、次の手順に従います- ans:=1 関数depth()を定義します。これが定着します ルートが空でない場合は、 0を返す 子:=値0、0を含む新しいリスト temp_chil
-
Pythonでn-aryツリーのルートを見つけるプログラム
配列内のn-aryツリーのノードが与えられたとします。ツリーを再構築して、ツリーのルートノードを見つけて返す必要があります。返されたノードから、ツリー全体をプレオーダー表記で表示する必要があります。 したがって、入力が次のような場合 その場合、出力は次のようになります [14, 27, 32, 42, 56, 65] ツリーのルートを使用して、ツリーのプレオーダートラバーサルを表示します。したがって、出力はツリーのプレオーダートラバーサルです。 これを解決するには、次の手順に従います- indegree:=整数値を含む新しいマップ ツリー内のノードごとに、実行します