Python樹的資料結構

2021-09-11 02:20:48 字數 4672 閱讀 5865

一,名詞:

根 :樹是由乙個叫做「根」的節點r以及0個或者多個非空子樹組成的

邊 : 子樹中的每一顆根都被來自根r的一條有向邊連線

樹葉(葉子): 沒有兒子的節點稱為樹葉

兄弟: 具有相同父親的節點稱為兄弟

祖父和孫子 路徑:從節點n1到nk的路徑定義為節點n1,n2,…nk的乙個序列

路徑的長: 這條路徑的長為該路徑上的邊的條數

深度 : 對任一節點ni的深度為從根到ni的唯一路徑的長

高 : 對任意乙個節點ni,ni的高是從ni到一片樹葉的最長路徑的長

祖先 : 如果存在從n1到n2的一條路徑,那麼n1是n2的一位祖先

後裔 : n2是n1的乙個後裔

真祖先 : n1不等於n2的時候,n1是n2的真祖先

真後裔: n1不等於n2的時候,n2是n1的真後裔

二,樹的實現

class treenode():

definit(self,data,firstchild,nextsibling):

self.data = data

self.firstchild = firstchild

self.nextsibling = nextsibling

三,樹的遍歷

深度優先

廣度優先

四,二叉樹

最多兩個孩子

五,二叉查詢樹(搜尋樹)

新增遍歷(深度優先)

遞迴用python實現二叉查詢樹

class treenode():

def __init__(self,data,left=none,right=none):

self.data = data

self.left = left

self.right = right

class tree():

def __init__(self):

self.root = none

#新增資料

def add(self,data):

node = treenode(data)

if self.root == none:

self.root = node

else:

currentnode = self.root

while true:

if data < currentnode.data:

if currentnode.left==none:

currentnode.left = node

break

else:

currentnode = currentnode.left

continue

else:

if currentnode.right==none:

currentnode.right = node

break

else:

currentnode = currentnode.right

continue

#是否包含資料

def contains(self,data):

flag = false

if self.root==none:

print("空樹")

else:

currentnode = self.root

while true:

if currentnode.data==data:

flag = true

break

else:

if data < currentnode.data:

if currentnode.left == none:

break

currentnode = currentnode.left

else:

if currentnode.right == none:

break

currentnode = currentnode.right

return flag

#查詢最小值

def findmin(self):

temp_min = none

if self.root==none:

print("空樹")

else:

currentnode = self.root

while currentnode.left != none:

currentnode = currentnode.left

temp_min = currentnode.data

return temp_min

#查詢最大值

def findmax(self):

temp_max = none

if self.root == none:

print("空樹")

else:

currentnode = self.root

while currentnode.right != none:

currentnode = currentnode.right

temp_max = currentnode.data

return temp_max

#刪除def remove(self,root,data):

if self.contains(data):

#樹中有要刪除的資料

pre_currentnode = none

currentnode = root

while true:

if currentnode.data == data:

#1,葉子節點

if currentnode.left==none and currentnode.right==none:

del currentnode

break

#2,乙個孩子的節點

elif currentnode.left==none and currentnode.right!=none:

if pre_currentnode==none:

self.root = currentnode.right

break

else:

if pre_currentnode.right == currentnode:

pre_currentnode.right = currentnode.right

else:

pre_currentnode.left = currentnode.right

break

elif currentnode.left != none and currentnode.right == none:

if pre_currentnode == none:

self.root = currentnode.left

break

else:

if pre_currentnode.right == currentnode:

pre_currentnode.right = currentnode.left

else:

pre_currentnode.left = currentnode.left

break

#3,兩個孩子的節點

else:

minnode = currentnode.right

while minnode.left != none:

minnode = minnode.left

currentnode.data = minnode.data

self.remove(currentnode.right,minnode.data)

break

else:

if data < currentnode.data:

pre_currentnode = currentnode

currentnode = currentnode.left

else:

pre_currentnode = currentnode

currentnode = currentnode.right

else:

#樹中沒有要刪除的資料

print("資料不存在")

#遍歷(深度優先)

def showall(self,root):

if root==none:

print("空樹")

else:

if self.root.data==root.data:

print(self.root.data)

if root.left!=none:

print(root.left.data)

self.showall(root.left)

if root.right!=none:

print(root.right.data)

self.showall(root.right)

tree = tree()

tree.add(6)

tree.add(2)

tree.add(8)

tree.add(1)

tree.add(5)

tree.add(3)

tree.add(4)

tree.remove(tree.root,2)

tree.showall(tree.root)

python資料結構 樹

樹是資料結構中常用到的一種結構,其實現較棧和隊稍為複雜一些。若樹中的所有節點的孩子節點數量不超過2個,則該為乙個二叉樹。巢狀列表 表示樹 樹的根是mytree 0 根的左子樹是mytree 1 和右子樹是mytree 2 二叉樹 class tree def init self,leftjd 0,r...

python資料結構之樹(概述)

在電腦科學中,樹是分層結構的抽象模型 本篇學習筆記記錄樹的內容如下 樹的基本功能 定義 術語 adt 樹的遍歷方法 前序 中序 後序 第一種 樹由一組節點和一組連線節點的邊組成。樹具有以下屬性 第二種 樹是空的,或者由乙個根節點和零個或多個子樹組成,每個子樹也是一棵樹。每個子樹的根節點通過邊連線到父...

資料結構 樹

樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...