ホームページ  >  記事  >  バックエンド開発  >  Pythonプログラミングにおけるバイナリツリーと7つのトラバーサルメソッドの実装方法を詳しく解説

Pythonプログラミングにおけるバイナリツリーと7つのトラバーサルメソッドの実装方法を詳しく解説

黄舟
黄舟オリジナル
2017-06-04 10:11:481906ブラウズ

この記事では、主に 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。