源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-11-16 04:49 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:python数据结构之二叉树的遍历实例
[b]遍历方案 [/b]    从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:     1).访问结点本身(N)     2).遍历该结点的左子树(L)     3).遍历该结点的右子树(R) [b]有次序: [/b]    NLR、LNR、LRN [b]遍历的命名[/b]     根据访问结点操作发生位置命名: NLR:前序遍历(PreorderTraversal亦称(先序遍历))  ——访问结点的操作发生在遍历其左右子树之前。 LNR:中序遍历(InorderTraversal)  ——访问结点的操作发生在遍历其左右子树之中(间)。 LRN:后序遍历(PostorderTraversal)    ——访问结点的操作发生在遍历其左右子树之后。 注:由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。 [b]遍历算法[/b] 1).先序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: a.访问根结点 b.遍历左子树 c.遍历右子树 2).中序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: a.遍历左子树 b.访问根结点 c.遍历右子树 3).后序遍历得递归算法定义: 若二叉树非空,则依次执行如下操作: a.遍历左子树 b.遍历右子树 c.访问根结点 [b]一、二叉树的递归遍历:[/b]
[u]复制代码[/u] 代码如下:
# -*- coding: utf - 8 - *- class TreeNode(object):     def __init__(self, left=0, right=0, data=0):         self.left = left         self.right = right         self.data = data       class BTree(object):     def __init__(self, root=0):         self.root = root     def is_empty(self):         if self.root is 0:             return True         else:             return False     def preorder(self, treenode):         '前序(pre-order,NLR)遍历'         if treenode is 0:             return         print treenode.data         self.preorder(treenode.left)         self.preorder(treenode.right)     def inorder(self, treenode):         '中序(in-order,LNR'         if treenode is 0:             return         self.inorder(treenode.left)         print treenode.data         self.inorder(treenode.right)     def postorder(self, treenode):         '后序(post-order,LRN)遍历'         if treenode is 0:             return         self.postorder(treenode.left)         self.postorder(treenode.right)         print treenode.data       node1 = TreeNode(data=1) node2 = TreeNode(node1, 0, 2) node3 = TreeNode(data=3) node4 = TreeNode(data=4) node5 = TreeNode(node3, node4, 5) node6 = TreeNode(node2, node5, 6) node7 = TreeNode(node6, 0, 7) node8 = TreeNode(data=8) root = TreeNode(node7, node8, 'root') bt = BTree(root) print u''' #生成的二叉树 # ------------------------ #          root #       7        8 #     6 #   2   5 # 1    3 4 # # ------------------------- ''' print '前序(pre-order,NLR)遍历 :\n' bt.preorder(bt.root) print '中序(in-order,LNR) 遍历 :\n' bt.inorder(bt.root) print '后序(post-order,LRN)遍历 :\n' bt.postorder(bt.root)
[b]二、.二叉树的非递归遍历[/b] 下面就用非递归的方式实现一遍。主要用到了 stack 和 queue维护一些数据节点:
[u]复制代码[/u] 代码如下:
# -*- coding: utf - 8 - *-       class TreeNode(object):     def __init__(self, left=0, right=0, data=0):         self.left = left         self.right = right         self.data = data       class BTree(object):     def __init__(self, root=0):         self.root = root     def is_empty(self):         if self.root is 0:             return True         else:             return False     def preorder(self, treenode):         '前序(pre-order,NLR)遍历'         stack = []         while treenode or stack:             if treenode is not 0:                 print treenode.data                 stack.append(treenode)                 treenode = treenode.left             else:                 treenode = stack.pop()                 treenode = treenode.right     def inorder(self, treenode):         '中序(in-order,LNR) 遍历'         stack = []         while treenode or stack:             if treenode:                 stack.append(treenode)                 treenode = treenode.left             else:                 treenode = stack.pop()                 print treenode.data                 treenode = treenode.right     # def postorder(self, treenode):     #     stack = []     #     pre = 0     #     while treenode or stack:     #         if treenode:     #             stack.append(treenode)     #             treenode = treenode.left     #         elif stack[-1].right != pre:     #             treenode = stack[-1].right     #             pre = 0     #         else:     #             pre = stack.pop()     #             print pre.data     def postorder(self, treenode):         '后序(post-order,LRN)遍历'         stack = []         queue = []         queue.append(treenode)         while queue:             treenode = queue.pop()             if treenode.left:                 queue.append(treenode.left)             if treenode.right:                 queue.append(treenode.right)             stack.append(treenode)         while stack:             print stack.pop().data     def levelorder(self, treenode):         from collections import deque         if not treenode:             return         q = deque([treenode])         while q:             treenode = q.popleft()             print treenode.data             if treenode.left:                 q.append(treenode.left)             if treenode.right:                 q.append(treenode.right)       node1 = TreeNode(data=1) node2 = TreeNode(node1, 0, 2) node3 = TreeNode(data=3) node4 = TreeNode(data=4) node5 = TreeNode(node3, node4, 5) node6 = TreeNode(node2, node5, 6) node7 = TreeNode(node6, 0, 7) node8 = TreeNode(data=8) root = TreeNode(node7, node8, 'root')       bt = BTree(root) print u''' #生成的二叉树 # ------------------------ #          root #       7        8 #     6 #   2   5 # 1    3 4 # # ------------------------- ''' print '前序(pre-order,NLR)遍历 :\n' bt.preorder(bt.root) print '中序(in-order,LNR) 遍历 :\n' bt.inorder(bt.root) print '后序(post-order,LRN)遍历 :\n' bt.postorder(bt.root) print '层序(level-order,LRN)遍历 :\n' bt.levelorder(bt.root)
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部