「DA:binarysearchtree」の版間の差分

提供:classwiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
= 二分探索木 =
= 二分探索木 =


  def insert(node, key):
  def insert(v, key):
     if node is None:
     if v is None:
         return {"key": key, "left": None, "right": None}
         return {"key": key, "left": None, "right": None}
    if key < node["key"]:
        node["left"] = insert(node["left"], key)
    elif key > node["key"]:
        node["right"] = insert(node["right"], key)
    return node
   
   
  def search(node, key):
    if key < v["key"]:
     if node is None:
        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 == node["key"]:
     if key == v["key"]:
         return True
         return True
     elif key < node["key"]:
         return search(node["left"], key)
     elif key < v["key"]:
         return search(v["left"], key)
     else:
     else:
         return search(node["right"], key)
         return search(v["right"], key)
   
   
  def delete(node, key):
  def delete(v, key):
     if node is None:
     if v is None:
         return None
         return None
     if key < node["key"]:
         node["left"] = delete(node["left"], key)
     if key < v["key"]:
     elif key > node["key"]:
         v["left"] = delete(v["left"], key)
         node["right"] = delete(node["right"], 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 ###ここを埋める###:
            return v["right"]
        if ###ここを埋める###:
            return v["left"]
   
   
         # 子が二つの場合
         # 子が二つの場合
         ### ここを埋める ###
         tmp = ###ここを埋める###
        while ###ここを埋める###:
            tmp = ###ここを埋める###
        v["key"] = ###ここを埋める###
        v["right"] = ###ここを埋める###
   
   
     return node
     return v
   
   
  def inorder(node):
  def inorder(v):
     if node is None:
     if v is None:
         return []
         return []
     return inorder(node["left"]) + [node["key"]] + inorder(node["right"])
     return inorder(v["left"]) + [v["key"]] + inorder(v["right"])
   
   
  # テストコード
  # テストコード
50行目: 67行目:
   
   
  print("要素を整列して表示:", inorder(tree))
  print("要素を整列して表示:", inorder(tree))
  print("Search 6:", search(tree, 6))
  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:27時点における最新版

二分探索木

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 ###ここを埋める###:
            return v["right"]
        if ###ここを埋める###:
            return v["left"]

        # 子が二つの場合
        tmp = ###ここを埋める###
        while ###ここを埋める###:
            tmp = ###ここを埋める###
        v["key"] = ###ここを埋める###
        v["right"] = ###ここを埋める###

    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))