樹
一,名詞:
根 :樹是由乙個叫做「根」的節點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.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...