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

Pythonでツリーのリーフノード(葉ノード)の数を数える方法

ツリー構造においてリーフノード(葉ノード)とは、子を持たない末端のノードのことです。本記事では、Pythonを使ってツリー内のリーフノードの数をカウントするプログラムを紹介します。

まず「Tree_structure」というクラスを作成し、ルートの値を設定するメソッドや、子ノードを追加するメソッドなどを定義します。ユーザーに対して複数の操作メニューを表示し、選択された内容に応じてツリーへの操作を実行できるようにします。

サンプルコード

class Tree_structure:
    def __init__(self, data=None):
        self.key = data
        self.children = []

    def set_root_node(self, data):
        self.key = data

    def add_vals(self, node):
        self.children.append(node)

    def search_val(self, key):
        if self.key == key:
            return self
        for child in self.children:
            temp = child.search(key)
            if temp is not None:
                return temp
        return None

    def count_leaf_node(self):
        leaf_nodes = []
        self.count_leaf_node_helper_fun(leaf_nodes)
        return len(leaf_nodes)

    def count_leaf_node_helper_fun(self, leaf_nodes):
        if self.children == []:
            leaf_nodes.append(self)
        else:
            for child in self.children:
                child.count_leaf_node_helper_fun(leaf_nodes)

tree = None

print('Menu (this assumes no duplicate keys)')
print('add <data> at root')
print('add <data> below <data>')
print('count')
print('quit')

while True:
    my_input = input('What operation would you like to perform ? ').split()

    operation = my_input[0].strip().lower()
    if operation == 'add':
        data = int(my_input[1])
        newNode = Tree_structure(data)
        sub_op = my_input[2].strip().lower()
        if sub_op == 'at':
            tree = newNode
        elif sub_op == 'below':
            my_pos = my_input[3].strip().lower()
            key = int(my_pos)
            ref_node = None
            if tree is not None:
                ref_node = tree.search_val(key)
            if ref_node is None:
                print('No such key.')
                continue
            ref_node.add_vals(newNode)

    elif operation == 'count':
        if tree is None:
            print('The tree is empty')
        else:
            count = tree.count_leaf_node()
            print('The number of leaf nodes are : {}'.format(count))

    elif operation == 'quit':
        break

実行結果

Menu (this assumes no duplicate keys)
add <data> at root
add <data> below <data>
count
quit
What operation would you like to perform ? add 78 at root
What operation would you like to perform ? add 90 below 78
What operation would you like to perform ? add 8 below 78
What operation would you like to perform ? count
The number of leaf nodes are : 2
What operation would you like to perform ? quit

コードの解説

  • まず、「Tree_structure」クラスを定義します。
  • コンストラクタでは、ノードの値を格納する「key」と、子ノードを保持する空のリスト「children」を初期化します。
  • 「set_root_node」メソッドは、ツリーのルートの値を設定するために使用します。
  • 「add_vals」メソッドは、指定したノードに新しい要素(子ノード)を追加します。
  • 「search_val」メソッドは、指定したキーの値を持つノードをツリー内から再帰的に検索します。
  • 「count_leaf_node」メソッドは、ツリー内のリーフノードの総数を取得します。内部ではリーフノードを格納するリストを作成し、ヘルパー関数を呼び出した後、そのリストの長さを返します。
  • 「count_leaf_node_helper_fun」は再帰的なヘルパー関数です。子ノードが存在しない場合(つまりリーフノードの場合)、そのノード自身をリストに追加し、子ノードがある場合は各子ノードに対して自分自身を再帰的に呼び出します。
  • メイン部分では、「ルートに追加」「指定ノードの下に追加」「カウント」「終了」の4つの操作メニューを提供しています。
  • ユーザーが選択した操作に応じて、対応する処理が実行され、その結果がコンソールに出力されます。

この例では、値78をルートとし、その下に90と8という2つの子ノードを追加しているため、リーフノードは90と8の2つとなり、カウント結果として「2」が出力されます。このように再帰処理を活用することで、任意の深さのツリー構造でも効率的にリーフノードを数えることができます。

  1. Pythonでn分木(n-aryツリー)のコピーを作成する方法を解説

    n分木のコピーとは本記事では、ルートノード「root」が与えられたn分木(n-aryツリー)の完全なコピーを作成し、元の木とコピーした木の両方に対して先行順走査(preorder traversal)を実行する方法を解説します。作成したコピーは、別の新しいルートノードに格納する必要があります。使用するノードの構造は以下のとおりです。Node: value : <整数> children : <配列>入力例と出力例たとえば、次のようなn分木が与えられた場合を考えてみましょう。この場合、出力は次のようになります。[14, 27, 32, 42, 56, 65

  2. Pythonで式ツリー(式木)を構築する方法:後置記法の式から式木を作るプログラム

    式ツリー(Expression Tree)とは、二分木の一種で、葉ノードには演算の対象となる値(オペランド)が格納され、内部ノードには演算子が格納されるデータ構造です。 例:「4 + ((7 + 9) * 2)」という式は、次のような式ツリーで表現できます。 問題を解くためのアプローチ 与えられた式から式ツリーを構築する際には、一般的にスタックというデータ構造を使用します。まず、与えられた後置記法(ポストフィックス記法)の式を走査しながら、以下の手順を実行していきます。 式の中にオペランドが現れた場合は、それをノードとして作成し、スタックにプッシュします。 演算子が現れた場合は、その演算