python中序遍历_python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)...

本文介绍如何用Python实现二叉树的创建及四种遍历方式:递归的前序、中序、后序遍历,以及队列和栈辅助的前序、中序、后序遍历和层次遍历。通过类定义`Node`和`Tree`,并提供相应的遍历方法。
摘要由CSDN通过智能技术生成

1 #-*- coding:utf-8 -*-

2 classNode:3 def __init__(self,data):4 self.data=data5 self.lchild=None6 self.rchild=None7

8 classTree:9 def __init__(self):10 self.queue=[]#利用队列存储树的节点

11 self.flag=0#存储树根后flag置为1

12 self.root=None13

14 #建树

15 defcreateTree(self,list):16 whileTrue:17 #list中没有数据,表示建树完成

18 if len(list)==0:19 return

20 #flag为0,表示树根不存在

21 if self.flag==0:22 self.root=Node(list[0])23 #讲树根存入队列

24 self.queue.append(self.root)25 #树根已创建,flag置为1

26 self.flag=1

27 #剔除list中第一个已经使用数

28 list.pop(0)29 else:30 '''

31 treeNode:队列中的第一个节点(该节点左右孩子不完全存在)32 添加treeNode的左右孩子,当添加treeNode的右孩子之后,33 将队列中的第一个节点出队。34 '''

35 treeNode=self.queue[0]36 if treeNode.lchild==None:37 treeNode.lchild=Node(list[0])38 self.queue.append(treeNode.lchild)39 list.pop(0)40 else:41 treeNode.rchild =Node(list[0])42 self.queue.append(treeNode.rchild)43 list.pop(0)44 self.queue.pop(0)45

46

47 #递归实现先序遍历

48 deffront_digui(self,root):49 if root==None:50 return

51 else:52 printroot.data,53 self.front_digui(root.lchild)54 self.front_digui(root.rchild)55 #递归实现中序遍历

56 defmiddle_digui(self,root):57 if root==None:58 return

59 else:60 self.middle_digui(root.lchild)61 printroot.data,62 self.middle_digui(root.rchild)63 #递归实现后序遍历

64 defbehind_digui(self,root):65 if root==None:66 return

67 else:68 self.behind_digui(root.lchild)69 self.behind_digui(root.rchild)70 printroot.data,71

72 #队栈实现先序遍历

73 deffront_queueAndStack(self,root):74 if root==None:75 return

76 #定义一个栈,存储节点

77 stack=[]78 node=root79 while stack ornode:80 #从树根开始一直输出左孩子

81 whilenode:82 printnode.data,83 #将输出的节点加入栈中

84 stack.append(node)85 node=node.lchild86 #该节点不存在左节点时,该节点出栈,搜索该节点右节点,

87 node=stack.pop()88 node=node.rchild89 #队栈实现中序遍历

90 defmiddle_queueAndStack(self,root):91 if root==None:92 return

93 #定义一个栈,存储节点

94 stack =[]95 node =root96 while stack ornode:97 #一直查找树的左节点,一直进栈

98 whilenode:99 stack.append(node)100 node=node.lchild101 node=stack.pop()#该节点不存在左节点,该节点出栈,查找右节点

102 printnode.data,103 node=node.rchild104 #队栈实现后序遍历

105 defbehind_queueAndStack(self,root):106 if root==None:107 return

108 #定义一个栈,存储节点

109 stack_1 =[]110 stack_2 =[]111 node =root112 stack_1.append(node)113 whilestack_1:114 #该节点出栈1.左右节点进栈1(对于左右节点,右节点先出栈1,也先进栈1)

115 node=stack_1.pop()116 ifnode.lchild:117 stack_1.append(node.lchild)118 ifnode.rchild:119 stack_1.append(node.rchild)120 #该节点进栈2

121 stack_2.append(node)122 whilestack_2:123 printstack_2.pop().data,124 #队栈实现层次遍历

125 deflevel_queueAndStack(self,root):126 if root==None:127 return

128 stack_1=[]129 stack_2=[]130 stack_1.append(root)131 stack_2.append(root)132 whilestack_1:133 node=stack_1.pop(0)134 ifnode.lchild:135 stack_1.append(node.lchild)136 stack_2.append(node.lchild)137 ifnode.rchild:138 stack_1.append(node.rchild)139 stack_2.append(node.rchild)140 whilestack_2:141 printstack_2.pop(0).data,142

143

144 if __name__ == '__main__':145 list=[0,1,2,3,4,5,6,7,8,9,]146 tree=Tree()147 tree.createTree(list)148 tree.front_digui(tree.root)149 print '\n'

150 tree.middle_digui(tree.root)151 print '\n'

152 tree.behind_digui(tree.root)153 print '\n'

154 tree.front_queueAndStack(tree.root)155 print '\n'

156 tree.middle_queueAndStack(tree.root)157 print '\n'

158 tree.behind_queueAndStack(tree.root)159 print '\n'

160 tree.level_queueAndStack(tree.root)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值