def postorder_travel2(node): """后序遍历,非递归法""" stack = Stack() while node is not None or not stack.is_empty(): while node is not None: # 下行循环,直到栈顶元素为空 stack.push(node) node = node.left if node.left is not None else node.right node = stack.pop() print(node, end=" ") if not stack.is_empty() and stack.top( ).left == node: # 栈非空且当前节点是栈顶的左子节点 node = stack.top().right else: # 没有右子树或右子树遍历完毕,强迫退栈 node = None
def preorder_travel2(node): """前序遍历,非递归法""" stack = Stack() while node is not None or not stack.is_empty(): while node is not None: # 沿左分支下行 print(node, end=" ") stack.push(node.right) # 右分支入栈 node = node.left # 指针指向左分支 node = stack.pop() # 遇到空树,回溯
def inorder_travel2(node): """中序遍历,非递归法""" stack = Stack() while node is not None or not stack.is_empty(): while node is not None: stack.push(node) node = node.left if node.left is not None else node.right node = stack.pop() print(node, end=" ") node = node.right
def dfs_graph(graph, v0): """深度优先图遍历""" from queue_stack import Stack vnum = graph.vertex_num() visited = [0] * vnum # visited 记录已访问顶点 visited[v0] = 1 DFS_seq = [v0] # DFS_seq 记录遍历序列 st = Stack() st.push((0, graph.out_edges(v0))) # 入栈 (i, edges) while not st.is_empty(): # 下次访问边edges[i] i, edges = st.pop() if i < len(edges): v, e = edges[i] st.push((i + 1, edges)) # 下次回来访问边edges[i+1] if not visited[v]: DFS_seq.append(v) visited[v] = 1 st.push((0, graph.out_edges(v))) return DFS_seq