1 #-*- coding:utf-8 -*- 2 class Node: 3 def __init__(self,data): 4 self.data=data 5 self.lchild=None 6 self.rchild=None 7 8 class Tree: 9 def __init__(self): 10 self.queue=[]#利用隊列存儲樹的節點 11 self.flag=0#存儲樹根后flag置為1 12 self.root=None 13 14 #建樹 15 def createTree(self,list): 16 while True: 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 def front_digui(self,root): 49 if root==None: 50 return 51 else: 52 print root.data, 53 self.front_digui(root.lchild) 54 self.front_digui(root.rchild) 55 # 遞歸實現中序遍歷 56 def middle_digui(self,root): 57 if root==None: 58 return 59 else: 60 self.middle_digui(root.lchild) 61 print root.data, 62 self.middle_digui(root.rchild) 63 # 遞歸實現后序遍歷 64 def behind_digui(self,root): 65 if root==None: 66 return 67 else: 68 self.behind_digui(root.lchild) 69 self.behind_digui(root.rchild) 70 print root.data, 71 72 # 隊棧實現先序遍歷 73 def front_queueAndStack(self,root): 74 if root==None: 75 return 76 #定義一個棧,存儲節點 77 stack=[] 78 node=root 79 while stack or node: 80 #從樹根開始一直輸出左孩子 81 while node: 82 print node.data, 83 #將輸出的節點加入棧中 84 stack.append(node) 85 node=node.lchild 86 #該節點不存在左節點時,該節點出棧,搜索該節點右節點, 87 node=stack.pop() 88 node=node.rchild 89 # 隊棧實現中序遍歷 90 def middle_queueAndStack(self,root): 91 if root==None: 92 return 93 # 定義一個棧,存儲節點 94 stack = [] 95 node = root 96 while stack or node: 97 #一直查找樹的左節點,一直進棧 98 while node: 99 stack.append(node) 100 node=node.lchild 101 node=stack.pop()#該節點不存在左節點,該節點出棧,查找右節點 102 print node.data, 103 node=node.rchild 104 # 隊棧實現后序遍歷 105 def behind_queueAndStack(self,root): 106 if root==None: 107 return 108 # 定義一個棧,存儲節點 109 stack_1 = [] 110 stack_2 = [] 111 node = root 112 stack_1.append(node) 113 while stack_1: 114 #該節點出棧1.左右節點進棧1(對於左右節點,右節點先出棧1,也先進棧1) 115 node=stack_1.pop() 116 if node.lchild: 117 stack_1.append(node.lchild) 118 if node.rchild: 119 stack_1.append(node.rchild) 120 #該節點進棧2 121 stack_2.append(node) 122 while stack_2: 123 print stack_2.pop().data, 124 # 隊棧實現層次遍歷 125 def level_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 while stack_1: 133 node=stack_1.pop(0) 134 if node.lchild: 135 stack_1.append(node.lchild) 136 stack_2.append(node.lchild) 137 if node.rchild: 138 stack_1.append(node.rchild) 139 stack_2.append(node.rchild) 140 while stack_2: 141 print stack_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)