python实现二叉树的遍历

本文实例为大家分享了python实现二叉树的遍历具体代码,供大家参考,具体内容如下

代码:

# -*- coding: gb2312 -*- 

class Queue(object): 

  def __init__(self):
    self.q = [] 

  def enqueue(self, item):
    self.q.append(item) 

  def dequeue(self):
    # if self.q != []:
    if len(self.q)>0:
       return self.q.pop(0)
    else:
      return None 

  def length(self):
    return len(self.q) 

  def isempty(self):
    return len(self.q)==0 

class Stack(object):
  def __init__(self):
    self.s = [] 

  def push(self, item):
    self.s.append(item) 

  def pop(self):
    if self.s !=[]:
      item = self.s.pop(-1)
    else:
      item = None
    return item 

  def length(self):
    return len(self.s) 

  def isempty(self):
    return self.s == [] 

  def top(self):
    return self.s[-1] 

class TreeNode(object): 

  def __init__(self, data, left=None, right=None):
    self.data = data
    self.left = left
    self.right = right
    self.visited = False 

  def setData(self, data):
    self.data = data 

  def setLeft(self, left):
    self.left = left 

  def setRight(self, right):
    self.right = right 

  def visit(self):
    print self.data,
    self.visited = True 

  def deVisit(self):
    self.visited = False 

class BinaryTree(object):
  def __init__(self, root):
    self.root = root 

  # 前序遍历(递归)
  def freshVisit(self, node):
    if node is not None:
      node.deVisit()
    if node.left:
      self.freshVisit(node.left)
    if node.right:
      self.freshVisit(node.right) 

  # 前序遍历(递归)
  def preOrder(self, node):
    if node is not None:
      node.visit()
    if node.left:
      self.preOrder(node.left)
    if node.right:
      self.preOrder(node.right) 

  # 中序遍历(递归)
  def inOrder(self, node):
    if node.left:
      self.inOrder(node.left)
    if node is not None:
      node.visit()
    if node.right:
      self.inOrder(node.right) 

  # 后序遍历(递归)
  def postOrder(self, node):
    if node.left:
      self.postOrder(node.left)
    if node.right:
      self.postOrder(node.right)
    if node is not None:
      node.visit()   

  # 递归遍历
  def orderTraveral(self, type):
    if type == 0:
      self.preOrder(self.root)
    elif type == 1:
      self.inOrder(self.root)
    elif type == 2:
      self.postOrder(self.root) 

  # 前序遍历(非递归)
  # 用到一个栈和一个队列
  # 首先是根节点入栈,再循环出栈
  # 出栈元素不为空,则访问
  # 出栈元素有左孩子节点则入栈,如果有右孩子节点则入队列
  # 出栈元素为空,则访问队列
  # 队列也为空则结束循环,否则队列元素出队
  # 访问出队元素,出队元素有左孩子节点则入栈,出队元素有右孩子节点则入队列
  # 循环直到最后退出
  def preOrderByNotRecursion(self):
    s = Stack()
    q = Queue()
    q.enqueue(self.root) 

    while not s.isempty() or not q.isempty(): 

      if not q.isempty():
        item = q.dequeue()
        item.visit()
        if item.left:
          q.enqueue(item.left)
        if item.right:
          s.push(item.right)
      elif not s.isempty():
        item = s.pop()
        item.visit()
        if item.left:
          q.enqueue(item.left)
        if item.right:
          s.push(item.right) 

  # 前序遍历(非递归)
  # 用到一个栈
  # 首先是根节点入栈,再循环出栈
  # 栈顶元素不为空,则访问, 并置已访问标志
  # 如栈顶元素有左孩子节点则入栈
  # 若栈顶元素已访问,则出栈
  # 出栈元素若有右孩子节点则入栈
  # 循环直到栈无元素退出
  def preOrderByNotRecursion2(self):
    s = Stack()
    s.push(self.root) 

    while not s.isempty():
      item = s.top()
      if item.visited:
        s.pop()
        if item.right:
          s.push(item.right)
      else:
        item.visit()
        if item.left:
          s.push(item.left) 

  # 中序遍历(非递归)
  # 用到一个栈
  # 先将根节点入栈,循环出栈
  # 如果出栈元素有左孩子节点并且左孩子节点没有访问过则入栈
  # 反之,则出栈并且访问;如果出栈元素有右孩子节点则入栈
  # 重复以上循环直到栈为空
  def inOrderByNotRecursion(self):
    s = Stack()
    s.push(self.root) 

    while not s.isempty():
      item = s.top()
      while(item.left and not item.left.visited):
        s.push(item.left)
        item = item.left
      else:
        item = s.pop()
        item.visit()
        if item.right:
          s.push(item.right) 

  # 后序遍历(非递归)
  # 用到一个栈
  # 先将根节点入栈,循环出栈
  # 如果出栈元素有左孩子节点并且左孩子节点没有访问过则入栈
  # 反之,如果栈顶元素如果有右孩子节点并且右孩子节点没有访问过,则入栈
  # 否则,出栈并访问
  # 重复以上循环直到栈为空
  def postOrderByNotRecursion(self):
    s = Stack()
    s.push(self.root) 

    while not s.isempty():
      item = s.top()
      while(item.left and not item.left.visited):
        s.push(item.left)
        item = item.left
      else:
        if item.right and not item.right.visited:
          s.push(item.right)
        else:
          item = s.pop()
          item.visit() 

  # 层次遍历(非递归)
  # 用到一个队列
  # 先将根节点入队列
  # 从队列取出一个元素,访问
  # 如有左孩子节点则入队,如有右孩子节点则入队
  # 重复以上操作直到队列入空
  def layerOrder(self):
    q = Queue()
    q.enqueue(self.root) 

    while not q.isempty():
      item = q.dequeue()
      item.visit()
      if item.left:
        q.enqueue(item.left)
      if item.right:
        q.enqueue(item.right) 

#      A
#    B      C
#  D    E  F    G
#H
if __name__ == '__main__': 

  nE = TreeNode('E');
  nF = TreeNode('F');
  nG = TreeNode('G');
  nH = TreeNode('H');
  nD = TreeNode('D', nH);
  nB = TreeNode('B', nD, nE);
  nC = TreeNode('C', nF, nG);
  nA = TreeNode('A', nB, nC);
  bTree = BinaryTree(nA); 

  # 前序递归遍历
  print '----------前序遍历(递归)-----------'
  bTree.orderTraveral(0)
  print '\n----------中序遍历(递归)-----------'
  bTree.orderTraveral(1)
  print '\n----------后序遍历(递归)-----------'
  bTree.orderTraveral(2) 

  print '\n\n----------前序遍历(非递归)-----------'
  print '----------方法一-----------'
  bTree.freshVisit(bTree.root)
  bTree.preOrderByNotRecursion()
  print '\n----------方法二-----------'
  bTree.freshVisit(bTree.root)
  bTree.preOrderByNotRecursion2()
  print '\n\n----------中序遍历(非递归)-----------'
  bTree.freshVisit(bTree.root)
  bTree.inOrderByNotRecursion()
  print '\n\n----------后序遍历(非递归)-----------'
  bTree.freshVisit(bTree.root)
  bTree.postOrderByNotRecursion() 

  print '\n\n----------层次遍历(非递归)-----------'
  bTree.freshVisit(bTree.root)
  bTree.layerOrder() 

结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python实现的二叉树定义与遍历算法实例

    本文实例讲述了python实现的二叉树定义与遍历算法.分享给大家供大家参考,具体如下: 初学python,需要实现一个决策树,首先实践一下利用python实现一个二叉树数据结构.建树的时候做了处理,保证建立的二叉树是平衡二叉树. # -*- coding: utf-8 -*- from collections import deque class Node: def __init__(self,val,left=None,right=None): self.val=val self.left=l

  • Python编程实现二叉树及七种遍历方法详解

    本文实例讲述了Python实现二叉树及遍历方法.分享给大家供大家参考,具体如下: 介绍: 树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树.FP-树.另外可以用来提高编码效率,如哈弗曼树. 代码: 用Python实现树的构造和几种遍历算法,虽然不难,不过还是把代码作了一下整理总结.实现功能: ① 树的构造 ② 递归实现先序遍历.中序遍历.后序遍历 ③ 堆栈实现先序遍历.中序遍历.后序遍历 ④ 队列实现层次遍历 #coding=utf-8 cl

  • python二叉树遍历的实现方法

    复制代码 代码如下: #!/usr/bin/python# -*- coding: utf-8 -*- class TreeNode(object):    def __init__(self,data=0,left=0,right=0):        self.data = data        self.left = left        self.right = right class BTree(object):    def __init__(self,root=0):     

  • python数据结构之二叉树的遍历实例

    遍历方案   从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作:   1).访问结点本身(N)   2).遍历该结点的左子树(L)   3).遍历该结点的右子树(R) 有次序:   NLR.LNR.LRN 遍历的命名 根据访问结点操作发生位置命名:NLR:前序遍历(PreorderTraversal亦称(先序遍历))  --访问结点的操作发生在遍历其左右子树之前.LNR:中序遍历(InorderTraversal)

  • Python数据结构与算法之二叉树结构定义与遍历方法详解

    本文实例讲述了Python数据结构与算法之二叉树结构定义与遍历方法.分享给大家供大家参考,具体如下: 先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历  采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # 访问结点,遍历左子树,如果左子树为空,则遍历右子树, # 如果右子树为空,则向上走到一个可以向右走的结点,继续该过程 preorder(t): if t: print t.value preorde

  • Python定义二叉树及4种遍历方法实例详解

    本文实例讲述了Python定义二叉树及4种遍历方法.分享给大家供大家参考,具体如下: Python & BinaryTree 1. BinaryTree (二叉树) 二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子树和右子树的二叉树组成. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒. 二叉树的第i层至多有2^{i-1}个结点 深度为k的二叉树至多有2^k-1个结点: 对任何一棵二叉

  • Python二叉树定义与遍历方法实例分析

    本文实例讲述了Python二叉树定义与遍历方法.分享给大家供大家参考,具体如下: 二叉树基本概述: 二叉树是有限个元素的几个,如果为空则为空二叉树,或者有一个结点称之为根节点,分列根节点两侧的为二叉树的左右子节点,二叉树有如下的性质: 1. 二叉树的每个结点不存在度大于2的结点 2. 二叉树的第i层至多有2^{i-1}个结点 3. 深度为k的二叉树至多有2^k - 1个结点 4. 二叉树中,度为0的结点数N0比度为2的结点数N2大1,即存在N2 + 1 = N0 Python代码: #codin

  • Python利用前序和中序遍历结果重建二叉树的方法

    本文实例讲述了Python利用前序和中序遍历结果重建二叉树的方法.分享给大家供大家参考,具体如下: 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 这道题比较容易,前序遍历的结果中,第一个结点一定是根结点,然后在中序遍历的结果中查找这个根结点,根结点左边的就是左子树,根结点右边的就是右子树,递归构造出左.右子树即可.示意图如图所示: 利用前序和中序遍历的结果重建二叉树 Python代码: # coding: utf-8 ''

  • Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例

    本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作.分享给大家供大家参考,具体如下: 实现一个功能: 输入:一颗二叉树的先序和中序遍历     输出:后续遍历 思想: 先序遍历中,第一个元素是树根     在中序遍历中找到树根,左边的是左子树 右边的是右子树 Python代码: # -*- coding:utf-8 -*- def fromFMtoL( mid ): global las #全局后序遍历 global fir #先序遍历 root = fir[0] #取

  • Python二叉树的定义及常用遍历算法分析

    本文实例讲述了Python二叉树的定义及常用遍历算法.分享给大家供大家参考,具体如下: 说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. 以下直入主题: 定义一颗二叉树,请看官自行想象其形状, class BinNode( ): def __init__( self, val ): self.lchild = None self.rchild =

  • Python实现二叉树结构与进行二叉树遍历的方法详解

    二叉树的建立 使用类的形式定义二叉树,可读性更好 class BinaryTree: def __init__(self, root): self.key = root self.left_child = None self.right_child = None def insert_left(self, new_node): if self.left_child == None: self.left_child = BinaryTree(new_node) else: t = BinaryTr

随机推荐