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

Pythonで二分木の葉ノードと非葉ノードの数を求めるプログラム

二分木が与えられたとき、最初の要素に葉ノード(リーフノード)の数2番目の要素に非葉ノードの数を格納した2つの数値のペアを求める問題を考えてみましょう。

例えば、次のような二分木が入力として与えられた場合を考えます。

Pythonで二分木の葉ノードと非葉ノードの数を求めるプログラム

この木には葉ノードが3つ、非葉ノードが2つ存在するため、出力は (3, 2) となります。

解き方のアルゴリズム

この問題は、再帰処理を使って以下の手順で解くことができます。

  • ノード n が null(None)である場合は、(0, 0) を返します。
  • n の左の子と右の子がどちらも null の場合(つまり n が葉ノードの場合)は、(1, 0) を返します。
  • left := solve(n の左の子)
  • right := solve(n の右の子)
  • (left[0] + right[0], 1 + left[1] + right[1]) を返します。第1要素は左右の部分木から得られる葉ノード数の合計、第2要素は自分自身を含む非葉ノードの数になります。

それでは、理解を深めるために実際の実装例を見てみましょう。

実装例

class TreeNode:
    def __init__(self, data, left = None, right = None):
        self.val = data
        self.left = left
        self.right = right
class Solution:
    def solve(self, n):
        if not n:
            return 0, 0
        if not n.left and not n.right:
            return 1, 0
        left, right = self.solve(n.left), self.solve(n.right)
        return left[0] + right[0], 1 + left[1] + right[1]
ob = Solution()
root = TreeNode(6)
root.left = TreeNode(2)
root.right = TreeNode(6)
root.right.left = TreeNode(10)
root.right.right = TreeNode(2)
print(ob.solve(root))

入力

root = TreeNode(6)
root.left = TreeNode(2)
root.right = TreeNode(6)
root.right.left = TreeNode(10)
root.right.right = TreeNode(2)

出力

(3, 2)
  1. Pythonで二分木内の長さkの一意なパスを数えるプログラム

    問題概要 一意な値を持つ二分木と整数 k が与えられます。このとき、木の中に存在する「長さ k の一意なパス」の総数を求めます。パスは親ノードから子ノードへ向かう方向でも、子ノードから親ノードへ向かう方向でも構いません。また、あるノードが片方のパスにのみ含まれる場合、その2つのパスは互いに異なるものとして扱います。 入力例と出力例 たとえば、次のような二分木が与えられたとします。 k = 3 の場合、出力は 4 になります。該当するパスは次の4本です。 [12, 8, 3] [12, 8, 10] [8, 12, 15] [3, 8, 10] 解き方:深さ優先探索(DFS)によるアプ

  2. Pythonで二分木の各レベルの最大幅を求めるプログラム

    二分木が与えられたとき、ツリー内の任意のレベルにおける最大幅を求めることを考えます。ここでいう「レベルの幅」とは、そのレベルにおいて最も左端にあるノードと最も右端にあるノードの間に含まれるノード数のことです。例えば、次のような二分木が入力として与えられた場合を考えてみましょう。この場合、出力は 2 となります。解決のための手順この問題を解くために、以下の手順に従います。各深さにおける位置の最小値と最大値を保持するマップ d を作成します。初期値は、最小値を無限大(∞)、最大値を 0 とします。関数 dfs() を定義します。この関数は引数として root、pos := 0、depth := 0