當前位置:股票大全官網 - 股票投資 - 詳細講解Python編程如何實現二叉樹和七種遍歷方法。

詳細講解Python編程如何實現二叉樹和七種遍歷方法。

本文主要介紹了Python編程實現二叉樹和七種遍歷方法,並結合實例詳細分析了Python二叉樹的定義和常見遍歷操作技巧。有需要的朋友可以參考壹下。

本文結合實例介紹了二叉樹和遍歷方法在Python中的實現。分享給妳,供妳參考,如下:

簡介:

樹是壹種非常重要的數據結構,主要用來提高搜索效率,比較適合重復搜索,比如二叉排序樹和FP- tree。另外還可以用來提高編碼效率,比如哈弗曼樹。

代碼:

用Python實現樹的構造和幾種遍歷算法並不難,但代碼是總結的。實現功能:

①樹的結構

(2)遞歸實現壹階遍歷、中階遍歷和末階遍歷。

(3)棧實現了壹階遍歷、中階遍歷和後序遍歷。

④隊列實現分層遍歷。

#編碼=utf-8

類節點(對象):

" ""節點類" " "

def init(self,elem=-1,lchild=None,rchild=None):

self.elem = elem

self.lchild = lchild

self.rchild = rchild

類別樹(對象):

" ""樹類" " "

定義初始化(自身):

self.root = Node()

self.myQueue = []

定義添加(self,elem):

" ""向樹中添加節點" " "

節點=節點(元素)

If self.root.elem == -1: #如果樹是空的,給根節點賦值。

self.root = node

self.myQueue.append(self.root)

否則:

TreeNode = self.myQueue[0] #此節點的子樹不是偶數。

如果treeNode.lchild == None:

treeNode.lchild = node

self . my queue . append(treenode . l child)

否則:

treeNode.rchild = node

self . my queue . append(treenode . rchild)

Self.myQueue.pop(0) #如果節點有右子樹,則丟棄該節點。

def front_digui(self,root):

" ""用遞歸實現樹的優先遍歷" " "

如果root == None:

返回

打印root.elem,

self.front_digui(root.lchild)

self . front _ di GUI(root . r chid)

def middle_digui(self,root):

" ""用遞歸實現樹的中序遍歷" " "

如果root == None:

返回

self.middle_digui(root.lchild)

打印root.elem,

self . middle _ di GUI(root . r chid)

def later_digui(self,root):

" ""用遞歸實現樹的後序遍歷" " "

如果root == None:

返回

self.later_digui(root.lchild)

self . later _ di GUI(root . r chid)

打印root.elem,

def front_stack(self,root):

" ""用棧實現樹的優先遍歷" " "

如果root == None:

返回

myStack = []

節點=根

while node或myStack:

While node: #從根節點開始,壹直尋找它的左子樹。

打印node.elem,

myStack.append(節點)

node = node.lchild

node = myStack.pop() #while的結尾表示當前節點為空,即前壹個節點沒有左子樹。

Node = node.rchild #開始查看它右邊的子樹。

def middle_stack(self,root):

" ""使用堆棧實現樹的中間順序遍歷" " "

如果root == None:

返回

myStack = []

節點=根

while node或myStack:

While node: #從根節點開始,壹直尋找它的左子樹。

myStack.append(節點)

node = node.lchild

node = myStack.pop() #while的結尾表示當前節點為空,即前壹個節點沒有左子樹。

打印node.elem,

Node = node.rchild #開始查看它右邊的子樹。

def later_stack(self,root):

" ""使用堆棧對樹進行後序遍歷" " "

如果root == None:

返回

myStack1 = []

myStack2 = []

節點=根

myStack1.append(節點)

While myStack1: #這個While循環的作用是找出後序遍歷的逆序,存儲在myStack2中。

node = myStack1.pop()

if node.lchild:

mystack 1 . append(node . l child)

if node.rchild:

mystack 1 . append(node . rchild)

myStack2.append(節點)

而myStack2: #將myStack2中的元素推出堆棧,這是後序遍歷順序。

打印myStack2.pop()。elem,

定義級別_隊列(自身,根):

" ""使用隊列實現樹的分層遍歷" " "

如果root == None:

返回

我的隊列= []

節點=根

myQueue.append(節點)

當我的隊列:

node = myQueue.pop(0)

打印node.elem,

if node.lchild!=無:

myQueue.append(node.lchild)

if node.rchild!=無:

myQueue.append(node.rchild)

if name == 'main ':

" ""主要功能" " "

Elems = range(10) #生成十個數據作為樹節點。

Tree = Tree() #創建新的樹對象。

對於elem中的elem:

Tree.add(elem) #逐個添加樹的節點。

'打印'隊列實現分層遍歷:'

樹.級別_隊列(樹.根)

'打印'

遞歸實現優先遍歷:'

tree.front_digui(tree.root)

'打印'

順序遍歷的遞歸實現:'

tree.middle_digui(tree.root)

'打印'

遞歸實現後序遍歷:'

tree.later_digui(tree.root)

'打印'

堆棧實現優先遍歷:'

tree.front_stack(tree.root)

'打印'

堆棧實現中的順序遍歷:'

tree.middle_stack(tree.root)

'打印'

堆棧實現後序遍歷:'

Tree.later_stack(tree.root)摘要:

樹的遍歷主要有兩種,壹種是深度優先遍歷,像前序、中序、後序;另壹種是廣度優先遍歷,像層次遍歷。在樹結構中,兩者的區別不是很明顯,但是當樹擴展到有向圖和無向圖時,深度優先搜索和廣度優先搜索的效率和作用還是有很大區別的。

深度優先級壹般是遞歸,寬度優先級壹般是排隊。壹般來說,大多數可以遞歸實現的算法也可以通過棧來實現。

印象中有壹種遞歸的方法可以構造壹棵樹,但是壹直搞不清楚怎麽構造。後來仔細考慮,遞歸的思路有點類似深度優先算法,樹的構造應該是廣度優先。如果使用遞歸,必須有終止條件,比如指定樹的深度。否則,構造的樹將偏向左側單子葉植物或右側單子葉植物。因此,在壹般樹的構造中最好使用隊列。