Pythonで配列が二分探索木(BST)の中間順巡回を表しているかどうかを判定する方法
数値の配列 nums が与えられたとき、その配列がある二分探索木(Binary Search Tree)を中間順巡回(inorder traversal)した結果と一致する順序で要素を保持しているかどうかを判定します。
例えば、入力が nums = [5, 8, 15, 18, 20, 26, 39] の場合、この配列は以下の二分探索木を中間順巡回した結果と一致するため、出力は True になります。
解法のポイント
ここで重要な性質があります。それは、二分探索木を中間順巡回すると、必ず昇順にソートされた要素列が得られるというものです。したがって、この問題は「配列が昇順に並んでいるかどうかを確認する」ことに帰着できます。
アルゴリズムの手順
- 配列
numsのサイズを取得します。 - サイズが 0 または 1 の場合は、要素が1つもしくは存在しないため、常に条件を満たすので
Trueを返します。 - インデックス 1 からサイズ - 1 までループし、隣接する要素を比較します。
nums[i - 1] > nums[i]となる箇所があれば、昇順になっていないためFalseを返します。 - すべての比較で問題がなければ、
Trueを返します。
それでは、実際の実装を見て理解を深めましょう。
実装例
def solve(nums):
size = len(nums)
if size == 0 or size == 1:
return True
for i in range(1, size):
if nums[i - 1] > nums[i]:
return False
return True
nums = [5, 8, 15, 18, 20, 26, 39]
print(solve(nums))入力
[5, 8, 15, 18, 20, 26, 39]
出力
True
計算量について
このアルゴリズムは配列を一度だけ走査するため、時間計算量は O(n)、追加のメモリ使用量は O(1) となります。木構造を実際に構築して巡回する必要がないため、非常に効率的な判定方法です。
-
Pythonで二分探索木の最小共通祖先(LCA)を求める方法【再帰アルゴリズム解説】
最小共通祖先(LCA)とは二分探索木(Binary Search Tree)が与えられたとき、指定された2つのノードの最小共通祖先(Lowest Common Ancestor:LCA)を求める問題を考えてみましょう。ノード p と q の LCA とは、「p と q の両方を子孫として持つノードの中で、最も深い位置にあるノード」のことです。例えば、次のような二分木があるとします。[6, 2, 8, 0, 4, 7, 9, null, null, 3, 5]この木は以下のような構造になります。この場合、2 と 8 の LCA は 6 となります。6 は 2 と 8 の両方を子孫に持ち、それより
-
Pythonでソート済み配列を高さバランスの二分探索木に変換する方法
ソートされた配列 A が与えられたとき、そこから高さバランスの取れた二分探索木(BST)を生成することを考えます。ここで「高さバランスの取れた二分木」とは、すべてのノードにおいて、左右の部分木の深さの差が常に1以下であるような二分木のことを指します。例として、配列が [-10, -3, 0, 5, 9] の場合、出力の一例は [0, -3, 9, -10, null, 5] のようになります。解法のアプローチこの問題は、配列の中央要素をルートに選ぶというシンプルな発想で解くことができます。具体的な手順は以下の通りです。配列 A が空の場合は、Null(None)を返します。配列の中央の要素を見