Exemplo n.º 1
0
 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
Exemplo n.º 2
0
 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()  # 遇到空树,回溯
Exemplo n.º 3
0
 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
Exemplo n.º 4
0
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