日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

数据结构之二叉树:二叉查找树基本功能,Python代码实现——10

發布時間:2024/7/5 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之二叉树:二叉查找树基本功能,Python代码实现——10 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構之二叉查找樹的代碼實現

定義

  • 二叉查找樹(Binary Search Tree,BST),是一種內存中特殊的樹類型的存儲結構,它允許對存儲在其結點的數據進行增刪改查,或者用作動態的數據集合,或是通過key查找對應value的查找表;

創建結點

  • 設計:可以使用順序表或鏈表實現二叉樹,這里使用鏈表實現,在學習堆時再使用順序表實現

使用鏈表結點設計:

class Node:def __init__(self, key=None, value=None):self.key = keyself.value = valueself.left = Noneself.right = None

left和right分別代表左右子結點,key是可比較的,用于進行順序匹配;value儲存值

實現的功能

  • 構造方法__init__(),root為根結點,默認為None,len為樹的大小
  • size()獲取BST中元素個數
  • put(_key, _value)向樹中添加鍵值對元素,元素按key排序,返回添加元素后的新樹
  • get(_key)通過鍵獲取樹中對應元素的值
  • delete(_key)通過鍵刪除樹中對應的元素
  • min_key()獲取最小的key
  • max_key()獲取最大的key
  • Python代碼實現

    import operatorclass Node:def __init__(self, key=None, value=None):self.key = keyself.value = valueself.left = Noneself.right = Noneclass BinarySearchTree:def __init__(self):self.root = Noneself.len = 0def size(self):return self.lendef put(self, _key, _value):"""Put an element into this tree and generate a new BST"""def put_into(node, _key, _value):"""Adjust position of new inserted nodeby BST character:left > root > right"""if not node:self.len += 1return Node(_key, _value)if operator.lt(_key, node.key):node.left = put_into(node.left, _key, _value)elif operator.gt(_key, node.key):node.right = put_into(node.right, _key, _value)elif operator.eq(_key, node.key):node.value = _valuereturn nodeself.root = put_into(self.root, _key, _value)return self.rootdef get(self, _key):"""Get a value responding to the given _key from this tree"""def get_value_by_key(node, _key):if not node:returnif operator.lt(_key, node.key):return get_value_by_key(node.left, _key)elif operator.gt(_key, node.key):return get_value_by_key(node.right, _key)else:return node.valuereturn get_value_by_key(self.root, _key)def delete(self, _key):"""Delete a node responding to the giving key(_key)"""def delete_value_by_key(node, _key):if not node:returnif operator.lt(_key, node.key):node.left = delete_value_by_key(node.left, _key)elif operator.gt(_key, node.key):node.right = delete_value_by_key(node.right, _key)else:self.len -= 1to_delete_node = nodeif node == self.root:self.root = Nonereturn# node = Noneif not to_delete_node.left:return to_delete_node.rightelif not to_delete_node.right:return to_delete_node.leftelse:min_right_tree = to_delete_node.rightpre = min_right_treewhile min_right_tree.left:pre = min_right_treemin_right_tree = min_right_tree.leftpre.left = Nonemin_right_tree.left = to_delete_node.leftmin_right_tree.right = to_delete_node.rightreturn min_right_treereturn delete_value_by_key(self.root, _key)def min_key(self):"""Find the minimum key"""def min_node(node):while node.left:node = node.leftreturn nodereturn min_node(self.root).keydef max_key(self):"""Find the maximum key"""def max_node(node):while node.right:node = node.rightreturn nodereturn max_node(self.root).keydef max_depth(self):"""Calculate the max depth of this tree"""def max_depth(node):max_left, max_right = 0, 0if not node:return 0if node.left:max_left = max_depth(node.left)if node.right:max_right = max_depth(node.right)return max(max_left, max_right) + 1return max_depth(self.root)

    主要代碼解釋:

    put()插入元素:使用遞歸,按照從上到下從左到右的順序,依次和插入的元素比較

    • 1.如果當前樹中沒有任何一個結點,則直接把新結點當做根結點使用并返回
    • 2.如果當前樹不為空, 則從根結點開始與傳入的元素的key進行比較:
      2.1如果新結點的key小于當前結點的key ,則繼續找當前結點的左子結點;
      2.2如果新結點的key大于當前結點的key ,則繼續找當前結點的右子結點;
      2.3如果新結點的key等于當前結點的key ,則樹中已經存在這樣的結點,替換該結點的value值即可。

    delete()刪除元素:跟插入元素類似,也是使用遞歸,尋找的順序按照從上到下從左到右的順序,依次和插入的元素比較,如果找到key相等的元素則做刪除動作

    • 如果找到key相等的元素,則只需要往這個結點的右子樹的左邊最深處尋找,根據排序的規律,找到的元素與key相等的元素交換位置即可

    代碼測試

    if __name__ == '__main__':BST = BinarySearchTree()BST.put('e', '5')BST.put('b', '2')BST.put('g', '7')BST.put('a', '1')BST.put('d', '4')BST.put('f', '6')BST.put('h', '8')BST.put('c', '3')print(f"The size of this binary tree now is {BST.size()}\n")key = 'a'print(f"\nGet element by key[{key}]: {BST.get(key)}")key = 'b'BST.delete(key)print(f"After deleting an node ({key}), the size of this tree: {BST.size()}")print(f"Get the deleted value (key[{key}]), it should be none: {BST.get(key)}")print(f"Get the value (key[{'a'}]), it should be {1}: {BST.get('a')}")

    測試結果

    The size of this binary tree now is 8Get element by key[a]: 1 After deleting an node (b), the size of this tree: 7 Get the deleted value (key[b]), it should be none: None Get the value (key[a]), it should be 1: 1Process finished with exit code 0

    總結

    以上是生活随笔為你收集整理的数据结构之二叉树:二叉查找树基本功能,Python代码实现——10的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 午夜久久福利 | 人人爱爱 | 激情午夜av | 我和公激情中文字幕 | 成人h动漫精品一区二区 | 91精品久久久久久久99蜜桃 | av中文字幕一区二区 | 黄色在线观看免费视频 | 毛片视频网站在线观看 | 亚洲精品久久久久久久久久吃药 | www.香蕉视频 | 亚洲人一区二区三区 | 欧美xxx视频 | 日韩国产精品一区二区三区 | 久久撸视频| 6080亚洲精品一区二区 | 人人妻人人澡人人爽欧美一区 | 在线成人看片 | 久操国产在线 | 鲁大师私人影院在线观看 | 亚洲欧美激情精品一区二区 | 亚洲春色av | 夜夜干夜夜 | 国产伦精品一区二区三区视频黑人 | 91看片黄色 | 黄色91在线观看 | 91丝袜美女 | 日本熟伦人妇xxxx | 欧美大片免费 | 性喷潮久久久久久久久 | 亚洲欧美日韩综合一区二区 | 国产又黄又嫩又滑又白 | 国产精品久久久久国产a级 国产一区二区在线播放 | 成人国产精品蜜柚视频 | 日韩熟妇一区二区三区 | 无毛av| 国产二级视频 | 日韩美女视频网站 | 少妇把腿扒开让我舔18 | 午夜影片 | 黄色免费网站视频 | 亚洲精选在线 | 国内激情 | 一级黄色淫片 | 日本少妇一区二区三区 | 另类男人与善交video | 中文字幕无码精品亚洲资源网久久 | www.成人国产 | 国产av一区二区三区传媒 | 超碰97国产 | 黄色一级在线观看 | 潘金莲三级80分钟 | 国产av一区二区不卡 | 久久7777 | 色噜噜噜| 上原亚衣av一区二区三区 | 在线观看黄色的网站 | 超碰在线最新地址 | 超级碰在线视频 | 欧美精品黑人猛交高潮 | 91在线欧美 | 四虎影裤| 国产综合久久久久 | 狠狠a| xxxxxxxx黄色片| 肉丝肉足丝袜一区二区三区 | 在线一二三区 | 成人影视免费观看 | 91精品视频在线播放 | 97精品久久久 | 亚洲爽爽网 | 三级av在线免费观看 | 丰满大肥婆肥奶大屁股 | 成人午夜视频在线播放 | 国产网站免费在线观看 | av操操| 久久久久久久久久久久久久久久久 | 大学生av| 久久一区国产 | 国内精品久久99人妻无码 | 成都电影免费大全 | 精彩视频一区二区三区 | 色偷偷网| 日日干干| 黄色免费视频网站 | 精品无码人妻一区二区三 | 豆花在线观看 | 亚洲国产精品女人久久久 | 99热这里只有精品4 精品国产黄色 | 免费播放毛片精品视频 | 久色国产 | 手机看片日韩欧美 | 亚洲精品伦理 | 韩国美女福利视频 | 国产一级黄色 | www.av88| 十八禁视频网站在线观看 | 亚洲一区二区在线播放 | 黑鬼巨鞭白妞冒白浆 |