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

Python實(shí)現(xiàn)二叉樹(shù)可以使用面向?qū)ο缶幊痰姆绞剑ㄟ^(guò)定義二叉樹(shù)節(jié)點(diǎn)類來(lái)實(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ù)實(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方法用于向二叉樹(shù)中插入節(jié)點(diǎn),find方法用于查找二叉樹(shù)中是否存在特定節(jié)點(diǎn),inorder_traversal方法用于對(duì)二叉樹(shù)進(jìn)行中序遍歷。
下面是如何使用這個(gè)Node類來(lái)創(chuàng)建一個(gè)二叉樹(shù):
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方法向樹(shù)中插入節(jié)點(diǎn),最后使用find方法查找節(jié)點(diǎn)并使用inorder_traversal方法對(duì)二叉樹(shù)進(jìn)行中序遍歷。
除了插入、查找和遍歷方法,二叉樹(shù)還有其他的操作方法,如刪除節(jié)點(diǎn)、判斷是否為二叉搜索樹(shù)、計(jì)算樹(shù)的深度等。下面是一個(gè)稍微完整一些的二叉樹(shù)示例代碼:
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方法來(lái)刪除指定的節(jié)點(diǎn);minimum方法來(lái)查找樹(shù)中的最小節(jié)點(diǎn);is_bst方法來(lái)判斷當(dāng)前樹(shù)是否為二叉搜索樹(shù);height方法來(lái)計(jì)算樹(shù)的深度。
我們可以用以下代碼來(lái)測(cè)試新增的方法:
# 創(chuàng)建二叉樹(shù)
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))
# 判斷是否為二叉搜索樹(shù)
print("Is it a BST?:", root.is_bst())
# 計(jì)算樹(shù)的深度
print("Tree height:", root.height(root))
這樣我們就完成了一個(gè)比較完整的二叉樹(shù)的實(shí)現(xiàn),同時(shí)也演示了如何在Python中使用面向?qū)ο缶幊趟枷雭?lái)實(shí)現(xiàn)一個(gè)數(shù)據(jù)結(jié)構(gòu)。
最后附上完整的二叉樹(shù)類實(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)建二叉樹(shù)
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))
# 判斷是否為二叉搜索樹(shù)
print("Is it a BST?:", root.is_bst())
# 計(jì)算樹(shù)的深度
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è)示例包含了插入、查找、刪除、遍歷、判斷是否為二叉搜索樹(shù)和計(jì)算樹(shù)的深度等。希望對(duì)看到的小伙伴有幫助。
到此這篇關(guān)于Python學(xué)習(xí)之二叉樹(shù)實(shí)現(xiàn)的示例詳解的文章就介紹到這了,更多相關(guān)Python二叉樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python 定時(shí)框架 Apscheduler原理及安裝過(guò)程
Apscheduler是一個(gè)非常強(qiáng)大且易用的類庫(kù),可以方便我們快速的搭建一些強(qiáng)大的定時(shí)任務(wù)或者定時(shí)監(jiān)控類的調(diào)度系統(tǒng),這篇文章主要介紹了Python 定時(shí)框架 Apscheduler ,需要的朋友可以參考下2019-06-06
Python使用Tesseract實(shí)現(xiàn)從圖像中讀取文本
Tesseract?是一個(gè)基于計(jì)算機(jī)的系統(tǒng),用于光學(xué)字符識(shí)別?(OCR)?和其他圖像到文本處理,本文將介紹如何使用?Python?中的?Tesseract?創(chuàng)建一個(gè)可以從圖像中讀取文本的程序,需要的可以參考下2023-11-11
編譯 pycaffe時(shí)報(bào)錯(cuò):fatal error: numpy/arrayobject.h沒(méi)有那個(gè)文件或目錄
這篇文章主要介紹了編譯 pycaffe時(shí)報(bào)錯(cuò):fatal error: numpy/arrayobject.h沒(méi)有那個(gè)文件或目錄,需要的朋友可以參考下2020-11-11
關(guān)于Python中flask-httpauth庫(kù)用法詳解
這篇文章主要介紹了關(guān)于Python中flask-httpauth庫(kù)用法詳解,Flask-HTTPAuth是一個(gè)?Flask?擴(kuò)展,它簡(jiǎn)化了?HTTP?身份驗(yàn)證與?Flask?路由的使用,需要的朋友可以參考下2023-04-04

