「DA:binarysearchtree」の版間の差分
ナビゲーションに移動
検索に移動
(→二分探索木) |
(→二分探索木) |
||
| 1行目: | 1行目: | ||
= 二分探索木 = | = 二分探索木 = | ||
def insert( | def insert(v, key): | ||
if | if v is None: | ||
return {"key": key, "left": None, "right": None} | return {"key": key, "left": None, "right": None} | ||
def search( | if key < v["key"]: | ||
if | v["left"] = insert(v["left"], key) | ||
elif key > v["key"]: | |||
v["right"] = insert(v["right"], key) | |||
return v | |||
def search(v, key): | |||
if v is None: | |||
return False | return False | ||
if key == | |||
if key == v["key"]: | |||
return True | return True | ||
elif key < | |||
return search( | elif key < v["key"]: | ||
return search(v["left"], key) | |||
else: | else: | ||
return search( | return search(v["right"], key) | ||
def delete( | def delete(v, key): | ||
if | if v is None: | ||
return None | return None | ||
if key < | |||
if key < v["key"]: | |||
elif key > | v["left"] = delete(v["left"], key) | ||
elif key > v["key"]: | |||
v["right"] = delete(v["right"], key) | |||
else: | else: | ||
# 葉(子なし)の場合 | # 葉(子なし)の場合 | ||
if v["left"] is None and v["right"] is None: | |||
return None | |||
# 子が一つの場合 | # 子が一つの場合 | ||
if v["left"] is None: | |||
return v["right"] | |||
if v["right"] is None: | |||
return v["left"] | |||
# 子が二つの場合 | # 子が二つの場合 | ||
tmp = v["right"] | |||
while tmp["left"]: | |||
tmp = tmp["left"] | |||
v["key"] = tmp["key"] | |||
v["right"] = delete(v["right"], tmp["key"]) | |||
return | return v | ||
def inorder( | def inorder(v): | ||
if | if v is None: | ||
return [] | return [] | ||
return inorder( | return inorder(v["left"]) + [v["key"]] + inorder(v["right"]) | ||
# テストコード | # テストコード | ||
| 50行目: | 67行目: | ||
print("要素を整列して表示:", inorder(tree)) | print("要素を整列して表示:", inorder(tree)) | ||
print(" | print("6を検索:", search(tree, 6)) | ||
tree = delete(tree, 10) | tree = delete(tree, 10) | ||
print("要素を整列して表示(10を削除後):", inorder(tree)) | print("要素を整列して表示(10を削除後):", inorder(tree)) | ||
2025年5月2日 (金) 03:25時点における版
二分探索木
def insert(v, key):
if v is None:
return {"key": key, "left": None, "right": None}
if key < v["key"]:
v["left"] = insert(v["left"], key)
elif key > v["key"]:
v["right"] = insert(v["right"], key)
return v
def search(v, key):
if v is None:
return False
if key == v["key"]:
return True
elif key < v["key"]:
return search(v["left"], key)
else:
return search(v["right"], key)
def delete(v, key):
if v is None:
return None
if key < v["key"]:
v["left"] = delete(v["left"], key)
elif key > v["key"]:
v["right"] = delete(v["right"], key)
else:
# 葉(子なし)の場合
if v["left"] is None and v["right"] is None:
return None
# 子が一つの場合
if v["left"] is None:
return v["right"]
if v["right"] is None:
return v["left"]
# 子が二つの場合
tmp = v["right"]
while tmp["left"]:
tmp = tmp["left"]
v["key"] = tmp["key"]
v["right"] = delete(v["right"], tmp["key"])
return v
def inorder(v):
if v is None:
return []
return inorder(v["left"]) + [v["key"]] + inorder(v["right"])
# テストコード
tree = None
for value in [8, 3, 10, 1, 6, 14, 4, 7, 13]:
tree = insert(tree, value)
print("要素を整列して表示:", inorder(tree))
print("6を検索:", search(tree, 6))
tree = delete(tree, 10)
print("要素を整列して表示(10を削除後):", inorder(tree))