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

Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム

問題の概要

二分木が与えられたとき、その木に含まれるすべてのノードが同じ値を持っているかどうかを判定することを考えます。

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

Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム

すべてのノードが同じ値を持っているため、出力は True になります。

解決のアプローチ

この問題は、再帰を使ってシンプルに解くことができます。以下の手順に従います。

  • solve() 関数を定義します。この関数は root(現在のノード)と val(比較対象の値)を引数として受け取ります。

  • root が null(None)の場合は、True を返します。空の部分木は条件を満たしているとみなせるためです。

  • val が未定義の場合は、root の値を val として設定します。これにより、最初のノードの値が基準値になります。

  • root の値が val と等しい」かつ「左部分木に対する solve() の結果が True」かつ「右部分木に対する solve() の結果が True」である場合に True を返します。

実装例

それでは、実際のコードを見て理解を深めましょう。

class TreeNode:
   def __init__(self, val, left=None, right=None):
      self.val = val
      self.left = left
      self.right = right

class Solution:
   def solve(self, root, val=None):
      if not root:
         return True
      if val is None:
         val = root.val
      return root.val == val and self.solve(root.left, val) and self.solve(root.right, val)

ob = Solution()
root = TreeNode(5)
root.left = TreeNode(5)
root.right = TreeNode(5)
root.left.left = TreeNode(5)
root.left.right = TreeNode(5)
print(ob.solve(root))

入力

root = TreeNode(5)
root.left = TreeNode(5)
root.right = TreeNode(5)
root.left.left = TreeNode(5)
root.left.right = TreeNode(5)

出力

True

計算量について

このアルゴリズムは各ノードを一度だけ訪問するため、時間計算量は O(n)(n はノード数)です。また、再帰の深さは木の高さに依存するため、空間計算量は最悪の場合 O(n)、平衡な木であれば O(log n) となります。

  1. Pythonで二分木の通り順走査(Inorder Traversal)が回文かどうかを判定する方法

    問題の概要各ノードに0〜9のいずれかの数字が格納された二分木があるとします。この木を通り順走査(inorder traversal)した結果が回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを判定するプログラムを作成します。例えば、次のような木が入力として与えられた場合を考えてみましょう。この木の通り順走査の結果は [2, 6, 10, 6, 2] となり、左右対称の並びであるため、出力は True になります。解決のアプローチこの問題は、再帰を使わずにスタックを利用した反復的な通り順走査を行うことで解けます。手順は以下のとおりです。ルートが null の場合は True を

  2. Pythonで二分木が二分探索木(BST)かどうかを判定する方法

    はじめに:BSTとは何か二分木が与えられたとき、それが二分探索木(Binary Search Tree:BST)であるかどうかを判定することは、データ構造の学習やコーディング面接でよく出題される定番の問題です。BSTには以下のような重要な性質があります。左部分木に含まれるすべてのノードの値は、現在のノードの値より小さい右部分木に含まれるすべてのノードの値は、現在のノードの値より大きいこれらの性質は、木の中のすべてのノードに対して再帰的に成り立つたとえば、次のような二分木を考えてみましょう。ルート:5左の子:1右の子:9(その左の子:7、さらに左の子:6・右の子:8/右の子:10)この場合、すべ