ホームページ >バックエンド開発 >Python チュートリアル >Pythonプログラミングにおけるバイナリツリーと7つのトラバーサルメソッドの実装方法を詳しく解説
この記事では、主に Pythonプログラミングバイナリ ツリーの実装と 7 つのトラバーサル メソッドを紹介し、Python バイナリ ツリーの定義と一般的なトラバーサル操作テクニックをサンプルの形式で詳細に分析します。この記事では、バイナリ ツリーとトラバーサル メソッドを実装する例を示して Python について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
はじめに:ツリーは非常に重要なタイプのデータ構造であり、その主な目的は検索効率を向上させることであり、繰り返しの検索に適しています。 . バイナリソートツリー、FPツリーなど。さらに、ハフマン木などのコーディング効率を向上させるために使用することもできます。
コード:
Pythonを使用してツリー構築といくつかのトラバーサルアルゴリズムを実装します。 難しいことではありませんが、コードをまとめます。実装機能: ① ツリー構築
②再帰
事前順序トラバーサル、順序内トラバーサル、事後トラバーサルを実装③ スタックは事前順序トラバーサル、順序内トラバーサル、事後トラバーサルを実装します
④ キュー 階層トラバーサルの実装
#coding=utf-8 class Node(object): """节点类""" def init(self, elem=-1, lchild=None, rchild=None): self.elem = elem self.lchild = lchild self.rchild = rchild class Tree(object): """树类""" def init(self): self.root = Node() self.myQueue = [] def add(self, elem): """为树添加节点""" node = Node(elem) if self.root.elem == -1: # 如果树是空的,则对根节点赋值 self.root = node self.myQueue.append(self.root) else: treeNode = self.myQueue[0] # 此结点的子树还没有齐。 if treeNode.lchild == None: treeNode.lchild = node self.myQueue.append(treeNode.lchild) else: treeNode.rchild = node self.myQueue.append(treeNode.rchild) self.myQueue.pop(0) # 如果该结点存在右子树,将此结点丢弃。 def front_digui(self, root): """利用递归实现树的先序遍历""" if root == None: return print root.elem, self.front_digui(root.lchild) self.front_digui(root.rchild) def middle_digui(self, root): """利用递归实现树的中序遍历""" if root == None: return self.middle_digui(root.lchild) print root.elem, self.middle_digui(root.rchild) def later_digui(self, root): """利用递归实现树的后序遍历""" if root == None: return self.later_digui(root.lchild) self.later_digui(root.rchild) print root.elem, def front_stack(self, root): """利用堆栈实现树的先序遍历""" if root == None: return myStack = [] node = root while node or myStack: while node: #从根节点开始,一直找它的左子树 print node.elem, myStack.append(node) node = node.lchild node = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了 node = node.rchild #开始查看它的右子树 def middle_stack(self, root): """利用堆栈实现树的中序遍历""" if root == None: return myStack = [] node = root while node or myStack: while node: #从根节点开始,一直找它的左子树 myStack.append(node) node = node.lchild node = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了 print node.elem, node = node.rchild #开始查看它的右子树 def later_stack(self, root): """利用堆栈实现树的后序遍历""" if root == None: return myStack1 = [] myStack2 = [] node = root myStack1.append(node) while myStack1: #这个while循环的功能是找出后序遍历的逆序,存在myStack2里面 node = myStack1.pop() if node.lchild: myStack1.append(node.lchild) if node.rchild: myStack1.append(node.rchild) myStack2.append(node) while myStack2: #将myStack2中的元素出栈,即为后序遍历次序 print myStack2.pop().elem, def level_queue(self, root): """利用队列实现树的层次遍历""" if root == None: return myQueue = [] node = root myQueue.append(node) while myQueue: node = myQueue.pop(0) print node.elem, if node.lchild != None: myQueue.append(node.lchild) if node.rchild != None: myQueue.append(node.rchild) if name == 'main': """主函数""" elems = range(10) #生成十个数据作为树节点 tree = Tree() #新建一个树对象 for elem in elems: tree.add(elem) #逐个添加树的节点 print '队列实现层次遍历:' tree.level_queue(tree.root) print '\n\n递归实现先序遍历:' tree.front_digui(tree.root) print '\n递归实现中序遍历:' tree.middle_digui(tree.root) print '\n递归实现后序遍历:' tree.later_digui(tree.root) print '\n\n堆栈实现先序遍历:' tree.front_stack(tree.root) print '\n堆栈实现中序遍历:' tree.middle_stack(tree.root) print '\n堆栈实现后序遍历:' tree.later_stack(tree.root)
ツリートラバーサルには主に 2 つのタイプがあります。1 つは、事前順序、中間順序、事後順序などの深さ優先トラバーサルです。幅優先トラバーサル (階層トラバーサルと同様)。ツリー構造では両者の違いはあまり明らかではありませんが、ツリーから有向グラフ、そして無向グラフへと拡張する場合、深さ優先探索と幅優先探索の効率と役割は依然として大きく異なります。
深さ優先は通常再帰を使用し、幅優先は通常キューを使用します。一般に、再帰を使用して実装できるアルゴリズムのほとんどは、スタックを使用して実装することもできます。以上がPythonプログラミングにおけるバイナリツリーと7つのトラバーサルメソッドの実装方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。