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)