>백엔드 개발 >파이썬 튜토리얼 >Python 프로그래밍에서 이진 트리와 7가지 탐색 방법을 구현하는 방법에 대한 자세한 설명

Python 프로그래밍에서 이진 트리와 7가지 탐색 방법을 구현하는 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-06-04 10:11:481953검색

이 글에서는 주로 PythonProgramming구현과 7가지 순회 방법을 소개합니다. Python 이진 트리의 정의와 일반적인 순회 연산 기법을 예제 형식으로 자세히 분석합니다.

이 문서에서는 이진 트리 및 순회 메서드 구현 예제를 통해 Python을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

소개:

Tree는 매우 중요한 유형의 데이터 구조로, 주요 목적은 검색 효율성을 높이는 것이며 반복 검색에 더 좋습니다. . 이진 정렬 트리, FP-트리 등이 있습니다. 또한 허프만 트리와 같이 코딩 효율성을 향상시키는 데에도 사용할 수 있습니다.

Code:

Python을 사용하여 트리 구성과 여러 순회 알고리즘을 구현합니다. 어렵지는 않지만 코드를 요약합니다. 구현 기능:

1 트리 구성
Recursion 선순 순회, 순순 순회, 후순 순회 구현
3 스택은 선순 순회, 순순 순회, 후순 순회를 구현합니다
IV Queue 계층적 순회 구현

#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)

요약:

트리 순회에는 두 가지 주요 유형이 있습니다. 하나는 사전 주문, 중간 주문 및 사후 주문과 같은 깊이 우선 순회입니다. 계층적 순회와 같은 너비 우선 순회. 둘의 차이는 트리 구조에서는 그다지 뚜렷하지 않지만, 트리에서 유방향 그래프, 무방향 그래프로 확장할 때 깊이 우선 탐색과 너비 우선 탐색의 효율성과 역할은 여전히 ​​매우 다릅니다.

깊이 우선은 일반적으로 재귀를 사용하고, 너비 ​​우선은 일반적으로 대기열을 사용합니다. 일반적으로 재귀를 사용하여 구현할 수 있는 대부분의 알고리즘은 스택을 사용하여 구현할 수도 있습니다.

재귀적으로 트리를 구성하는 방법이 있다는 인상을 받았지만 트리를 구성하는 방법을 전혀 알 수 없었습니다. 신중하게 생각해 본 결과 재귀적 아이디어는 깊이 우선 알고리즘과 다소 유사하며 트리 구성은 너비 우선이어야 한다는 것을 깨달았습니다. 재귀를 사용하는 경우 트리 깊이 지정 등 종료 조건이 있어야 합니다. 그렇지 않으면 구성된 트리가 왼쪽 단일 하위 트리 또는 오른쪽 단일 하위 트리 쪽으로 편향됩니다. 따라서 일반적인 트리 구성에는 큐를 사용하는 것이 좋습니다.

위 내용은 Python 프로그래밍에서 이진 트리와 7가지 탐색 방법을 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.