Python學(xué)習(xí)之二叉樹實(shí)現(xiàn)的示例詳解
Python實(shí)現(xiàn)二叉樹

Python實(shí)現(xiàn)二叉樹可以使用面向?qū)ο缶幊痰姆绞剑ㄟ^定義二叉樹節(jié)點(diǎn)類來實(shí)現(xiàn)。每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)據(jù)元素、左右子節(jié)點(diǎn)指針和一些操作方法,如插入節(jié)點(diǎn)、查找節(jié)點(diǎn)、刪除節(jié)點(diǎn)等。
以下是一個(gè)簡(jiǎn)單的二叉樹實(shí)現(xiàn)示例:
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
def find(self, data):
if data < self.data:
if self.left is None:
return str(data) + " Not Found"
return self.left.find(data)
elif data > self.data:
if self.right is None:
return str(data) + " Not Found"
return self.right.find(data)
else:
return str(self.data) + " is found"
def inorder_traversal(self, root):
res = []
if root:
res = self.inorder_traversal(root.left)
res.append(root.data)
res = res + self.inorder_traversal(root.right)
return res
在上述代碼中,Node類定義了一個(gè)節(jié)點(diǎn),包含數(shù)據(jù)元素data,以及左右子節(jié)點(diǎn)指針left和right。insert方法用于向二叉樹中插入節(jié)點(diǎn),find方法用于查找二叉樹中是否存在特定節(jié)點(diǎn),inorder_traversal方法用于對(duì)二叉樹進(jìn)行中序遍歷。
下面是如何使用這個(gè)Node類來創(chuàng)建一個(gè)二叉樹:
root = Node(50) root.insert(30) root.insert(20) root.insert(40) root.insert(70) root.insert(60) root.insert(80) # 查找節(jié)點(diǎn) print(root.find(70)) # Output: 70 is found print(root.find(90)) # Output: 90 Not Found # 中序遍歷 print(root.inorder_traversal(root)) # Output: [20, 30, 40, 50, 60, 70, 80]
在上述代碼中,首先創(chuàng)建了一個(gè)根節(jié)點(diǎn)root,然后使用insert方法向樹中插入節(jié)點(diǎn),最后使用find方法查找節(jié)點(diǎn)并使用inorder_traversal方法對(duì)二叉樹進(jìn)行中序遍歷。
除了插入、查找和遍歷方法,二叉樹還有其他的操作方法,如刪除節(jié)點(diǎn)、判斷是否為二叉搜索樹、計(jì)算樹的深度等。下面是一個(gè)稍微完整一些的二叉樹示例代碼:
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
def find(self, data):
if data < self.data:
if self.left is None:
return None
return self.left.find(data)
elif data > self.data:
if self.right is None:
return None
return self.right.find(data)
else:
return self
def delete(self, data):
if self is None:
return self
if data < self.data:
self.left = self.left.delete(data)
elif data > self.data:
self.right = self.right.delete(data)
else:
if self.left is None:
temp = self.right
self = None
return temp
elif self.right is None:
temp = self.left
self = None
return temp
temp = self.right.minimum()
self.data = temp.data
self.right = self.right.delete(temp.data)
return self
def minimum(self):
if self.left is None:
return self
return self.left.minimum()
def is_bst(self):
if self.left:
if self.left.data > self.data or not self.left.is_bst():
return False
if self.right:
if self.right.data < self.data or not self.right.is_bst():
return False
return True
def height(self, node):
if node is None:
return 0
left_height = self.height(node.left)
right_height = self.height(node.right)
return max(left_height, right_height) + 1
def inorder_traversal(self, root):
res = []
if root:
res = self.inorder_traversal(root.left)
res.append(root.data)
res = res + self.inorder_traversal(root.right)
return res
在這個(gè)示例中,我們新增了delete方法來刪除指定的節(jié)點(diǎn);minimum方法來查找樹中的最小節(jié)點(diǎn);is_bst方法來判斷當(dāng)前樹是否為二叉搜索樹;height方法來計(jì)算樹的深度。
我們可以用以下代碼來測(cè)試新增的方法:
# 創(chuàng)建二叉樹
root = Node(50)
root.insert(30)
root.insert(20)
root.insert(40)
root.insert(70)
root.insert(60)
root.insert(80)
# 刪除節(jié)點(diǎn)
print("Deleting node 20:")
root.delete(20)
print(root.inorder_traversal(root))
# 判斷是否為二叉搜索樹
print("Is it a BST?:", root.is_bst())
# 計(jì)算樹的深度
print("Tree height:", root.height(root))
這樣我們就完成了一個(gè)比較完整的二叉樹的實(shí)現(xiàn),同時(shí)也演示了如何在Python中使用面向?qū)ο缶幊趟枷雭韺?shí)現(xiàn)一個(gè)數(shù)據(jù)結(jié)構(gòu)。
最后附上完整的二叉樹類實(shí)現(xiàn)代碼:
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
def find(self, data):
if data < self.data:
if self.left is None:
return None
return self.left.find(data)
elif data > self.data:
if self.right is None:
return None
return self.right.find(data)
else:
return self
def delete(self, data):
if self is None:
return self
if data < self.data:
self.left = self.left.delete(data)
elif data > self.data:
self.right = self.right.delete(data)
else:
if self.left is None:
temp = self.right
self = None
return temp
elif self.right is None:
temp = self.left
self = None
return temp
temp = self.right.minimum()
self.data = temp.data
self.right = self.right.delete(temp.data)
return self
def minimum(self):
if self.left is None:
return self
return self.left.minimum()
def is_bst(self):
if self.left:
if self.left.data > self.data or not self.left.is_bst():
return False
if self.right:
if self.right.data < self.data or not self.right.is_bst():
return False
return True
def height(self, node):
if node is None:
return 0
left_height = self.height(node.left)
right_height = self.height(node.right)
return max(left_height, right_height) + 1
def inorder_traversal(self, root):
res = []
if root:
res = self.inorder_traversal(root.left)
res.append(root.data)
res = res + self.inorder_traversal(root.right)
return res
if __name__ == '__main__':
# 創(chuàng)建二叉樹
root = Node(50)
root.insert(30)
root.insert(20)
root.insert(40)
root.insert(70)
root.insert(60)
root.insert(80)
# 刪除節(jié)點(diǎn)
print("Deleting node 20:")
root.delete(20)
print(root.inorder_traversal(root))
# 判斷是否為二叉搜索樹
print("Is it a BST?:", root.is_bst())
# 計(jì)算樹的深度
print("Tree height:", root.height(root))
運(yùn)行代碼后,可以得到以下輸出:
Deleting node 20:
[30, 40, 50, 60, 70, 80]
Is it a BST?: True
Tree height: 3
這個(gè)示例包含了插入、查找、刪除、遍歷、判斷是否為二叉搜索樹和計(jì)算樹的深度等。希望對(duì)看到的小伙伴有幫助。
到此這篇關(guān)于Python學(xué)習(xí)之二叉樹實(shí)現(xiàn)的示例詳解的文章就介紹到這了,更多相關(guān)Python二叉樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何徹底解決Python中matplotlib不顯示中文的問題詳解(顯示方框)
Matplotlib繪制圖像顯示中文的時(shí)候,中文會(huì)變成小方格子,下面這篇文章主要給大家介紹了關(guān)于如何徹底解決Python中matplotlib不顯示中文問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
python3 批量獲取對(duì)應(yīng)端口服務(wù)的實(shí)例
今天小編就為大家分享一篇python3 批量獲取對(duì)應(yīng)端口服務(wù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
使用Python實(shí)現(xiàn)在Word文檔中進(jìn)行郵件合并
郵件合并是現(xiàn)代辦公中一項(xiàng)顯著提升效率的技術(shù),它巧妙地將大量個(gè)體數(shù)據(jù)與預(yù)設(shè)的文檔模板相結(jié)合,實(shí)現(xiàn)了一次性批量生成定制化文檔,下面我們就來看看如何使用Python實(shí)現(xiàn)在Word文檔中進(jìn)行郵件合并吧2024-04-04
Python3中urllib庫(kù)添加請(qǐng)求頭的兩種方式
Python?3中的urllib模塊可以用來處理URL,包括下載和上傳文件、創(chuàng)建和讀取cookie、訪問Web?API等,本文給大家介紹Python3中urllib庫(kù)添加請(qǐng)求頭的兩種方式,感興趣的朋友一起看看吧2023-10-10
Python+Tkinter打造簽名設(shè)計(jì)工具
這篇文章主要為大家分享如何利用Python Tkinter庫(kù)制作帶圖形界面的一個(gè)簽名設(shè)計(jì)工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04
對(duì)python過濾器和lambda函數(shù)的用法詳解
今天小編就為大家分享一篇對(duì)python過濾器和lambda函數(shù)的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
在Python3.74+PyCharm2020.1 x64中安裝使用Kivy的詳細(xì)教程
這篇文章主要介紹了在Python3.74+PyCharm2020.1 x64中安裝使用Kivy的詳細(xì)教程,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
四行Python3代碼實(shí)現(xiàn)圖片添加美顏效果
這篇文章主要為大家介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)給圖片添加美顏效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-04-04
Python+selenium實(shí)現(xiàn)瀏覽器基本操作詳解
這篇文章主要為大家詳細(xì)介紹了如何通過python腳本實(shí)現(xiàn)瀏覽器的一些基本操作,如:瀏覽器的前進(jìn)后退、頁(yè)面刷新等,感興趣的可以學(xué)習(xí)一下2022-06-06

