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) となります。
-
Pythonで二分木の通り順走査(Inorder Traversal)が回文かどうかを判定する方法
問題の概要各ノードに0〜9のいずれかの数字が格納された二分木があるとします。この木を通り順走査(inorder traversal)した結果が回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを判定するプログラムを作成します。例えば、次のような木が入力として与えられた場合を考えてみましょう。この木の通り順走査の結果は [2, 6, 10, 6, 2] となり、左右対称の並びであるため、出力は True になります。解決のアプローチこの問題は、再帰を使わずにスタックを利用した反復的な通り順走査を行うことで解けます。手順は以下のとおりです。ルートが null の場合は True を
-
Pythonで二分木が二分探索木(BST)かどうかを判定する方法
はじめに:BSTとは何か二分木が与えられたとき、それが二分探索木(Binary Search Tree:BST)であるかどうかを判定することは、データ構造の学習やコーディング面接でよく出題される定番の問題です。BSTには以下のような重要な性質があります。左部分木に含まれるすべてのノードの値は、現在のノードの値より小さい右部分木に含まれるすべてのノードの値は、現在のノードの値より大きいこれらの性質は、木の中のすべてのノードに対して再帰的に成り立つたとえば、次のような二分木を考えてみましょう。ルート:5左の子:1右の子:9(その左の子:7、さらに左の子:6・右の子:8/右の子:10)この場合、すべ