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