生活随笔
收集整理的這篇文章主要介紹了
Python二叉树遍历
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
樹(shù)的遍歷是樹(shù)的一種重要的運(yùn)算。所謂遍歷是指對(duì)樹(shù)中所有結(jié)點(diǎn)的信息的訪問(wèn),即依次對(duì)樹(shù)中每個(gè)結(jié)點(diǎn)訪問(wèn)一次且僅訪問(wèn)一次,我們把這種對(duì)所有節(jié)點(diǎn)的訪問(wèn)稱為遍歷(traversal)。那么樹(shù)的兩種重要的遍歷模式是深度優(yōu)先遍歷和廣度優(yōu)先遍歷,深度優(yōu)先一般用遞歸,廣度優(yōu)先一般用隊(duì)列。
一、廣度優(yōu)先遍歷(層次遍歷)
從樹(shù)的root開(kāi)始,從上到下從從左到右遍歷整個(gè)樹(shù)的節(jié)點(diǎn)
二、深度優(yōu)先遍歷
對(duì)于一顆二叉樹(shù),深度優(yōu)先搜索(Depth First Search)是沿著樹(shù)的深度遍歷樹(shù)的節(jié)點(diǎn),盡可能深的搜索樹(shù)的分支。
那么深度遍歷有重要的三種方法。這三種方式常被用于訪問(wèn)樹(shù)的節(jié)點(diǎn),它們之間的不同在于訪問(wèn)每個(gè)節(jié)點(diǎn)的次序不同。這三種遍歷分別叫做先序遍歷(preorder),中序遍歷(inorder)和后序遍歷(postorder)。
1、先序遍歷 在先序遍歷中,我們先訪問(wèn)根節(jié)點(diǎn),然后遞歸使用先序遍歷訪問(wèn)左子樹(shù),再遞歸使用先序遍歷訪問(wèn)右子樹(shù)
根節(jié)點(diǎn)->左子樹(shù)->右子樹(shù)
2、中序遍歷 在中序遍歷中,我們遞歸使用中序遍歷訪問(wèn)左子樹(shù),然后訪問(wèn)根節(jié)點(diǎn),最后再遞歸使用中序遍歷訪問(wèn)右子樹(shù)
左子樹(shù)->根節(jié)點(diǎn)->右子樹(shù)
3、后序遍歷 在后序遍歷中,我們先遞歸使用后序遍歷訪問(wèn)左子樹(shù)和右子樹(shù),最后訪問(wèn)根節(jié)點(diǎn)
左子樹(shù)->右子樹(shù)->根節(jié)點(diǎn)
'''
樹(shù)形結(jié)構(gòu)
'''class Node(object):'''節(jié)點(diǎn)類(lèi)'''def __init__(self, elem, lChild = None, rChild = None):self.elem = elemself.lChild = lChild #左子樹(shù)self.rChild = rChild #又子樹(shù)class Tree(object):'''二叉樹(shù)'''def __init__(self, node = None):self.root = nodedef add(self, item):'''添加子樹(shù)''''''思路1、先找到要添加元素的節(jié)點(diǎn)'''node = Node(item)if self.root is None:self.root = nodereturnli = [self.root]while li:cur_node = li.pop(0)if cur_node.lChild is not None:li.append(cur_node.lChild)else:cur_node.lChild = nodereturnif cur_node.rChild is not None:li.append(cur_node.rChild)else:cur_node.rChild = nodereturndef breadth_travel(self):'''廣度優(yōu)先遍歷'''if self.root is None:returnli = [self.root]while li:cur_node = li.pop(0)print(cur_node.elem, end=' ')if cur_node.lChild is not None:li.append(cur_node.lChild)if cur_node.rChild is not None:li.append(cur_node.rChild)print(' ')def preorder(self, node):'''先序遍歷'''if node is None:returnprint(node.elem, end=' ')self.preorder(node.lChild)self.preorder(node.rChild)def inorder(self, node):'''中序優(yōu)先遍歷'''if node is None:returnself.preorder(node.lChild)print(node.elem, end=' ')self.preorder(node.rChild)def postorder(self, node):'''后續(xù)優(yōu)先遍歷'''if node is None:returnself.preorder(node.lChild)self.preorder(node.rChild)print(node.elem, end=' ')if __name__ == "__main__":tree = Tree()tree.add(0)tree.add(1)tree.add(2)tree.add(3)tree.add(4)tree.add(5)tree.add(6)tree.add(7)tree.add(8)tree.add(9)tree.breadth_travel()print(" - ")tree.preorder(tree.root)print(" ")tree.inorder(tree.root)print(" ")tree.postorder(tree.root)print(" ")
?
總結(jié)
以上是生活随笔為你收集整理的Python二叉树遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。