[Orden] recorrido Python árbol binario, en el recorrido de orden, orden posterior recursiva y la versión implementos no recursivos prueba +

algoritmo referencia detallada: https://blog.csdn.net/Monster_ii/article/details/82115772

 

Probar árbol binario:

Preorden resultados de recorrido: 5,324,768

Finde resultados de recorrido: 2,345,678

Resultados orden posterior: 2,436,875

Secuencia a través de los resultados: 5372468

 

código

1, un preorder traversal (recursivo y no recursivo)

2, a finde traversal (recursivo y no recursivo)

3, postorden (recursivo y no recursivo)

4, preorder capa

 

1, un preorder traversal (recursivo y no recursivo)

class TreeNode:
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None
        self.parent = None

# 递归
qianxu = []
def PreOrder(root):
    if not root:
        return None
    qianxu.append(root.val)
    PreOrder(root.left)
    PreOrder(root.right)

# 非递归
def Pre_Order(root):
    data = []
    stack = []
    cur = root
    while cur or stack:
        while cur: # 若当前节点不为空
            data.append(cur.val) # 得到当前节点值
            stack.append(cur) # 压入栈中
            cur = cur.left # 去往左子树
        top = stack.pop() # 来到这里,说明当前节点为空,也就是当前节点的父节点无左子树,取出栈顶元素也就是当前节点的父节点
        cur = top.right # 往右子树的方向,若右子树为空则看栈是不是空,若栈不为空,再取出栈顶节点,访问其右子树
    return data

if __name__ == '__main__':
    a1 = TreeNode(5)
    a2 = TreeNode(3)
    a3 = TreeNode(7)
    a4 = TreeNode(2)
    a5 = TreeNode(4)
    a6 = TreeNode(6)
    a7 = TreeNode(8)
    a1.left = a2
    a1.right = a3
    a2.left = a4
    a2.right = a5
    a3.left = a6
    a3.right = a7
    PreOrder(a1)
    print(qianxu)
    print(Pre_Order(a1))

 

2, a finde traversal (recursivo y no recursivo)

class TreeNode:
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None
        self.parent = None

# 递归
zhongxu = []
def InOrder(root):
    if not root:
        return None
    InOrder(root.left)
    zhongxu.append(root.val)
    InOrder(root.right)

# 非递归
def In_Order(root):
    data = []
    stack = []
    cur = root
    while cur or stack:
        while cur:
            stack.append(cur)
            cur = cur.left
        top = stack.pop()
        data.append(top.val)
        cur = top.right
    return data

if __name__ == '__main__':
    a1 = TreeNode(5)
    a2 = TreeNode(3)
    a3 = TreeNode(7)
    a4 = TreeNode(2)
    a5 = TreeNode(4)
    a6 = TreeNode(6)
    a7 = TreeNode(8)
    a1.left = a2
    a1.right = a3
    a2.left = a4
    a2.right = a5
    a3.left = a6
    a3.right = a7
    InOrder(a1)
    print(zhongxu)
    print(In_Order(a1))

 

3, postorden (recursivo y no recursivo)

class TreeNode:
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None
        self.parent = None

# 递归
houxu = []
def PastOrder(root):
    if not root:
        return None
    PastOrder(root.left)
    PastOrder(root.right)
    houxu.append(root.val)

# 非递归
def Past_Order(root):
    data = []
    stack = []
    stack.append(root)
    while stack:
        node = stack.pop()
        if not node:
            continue
        stack.append(node.left)
        stack.append(node.right)
        data.append(node.val)
    return data[::-1]


if __name__ == '__main__':
    a1 = TreeNode(5)
    a2 = TreeNode(3)
    a3 = TreeNode(7)
    a4 = TreeNode(2)
    a5 = TreeNode(4)
    a6 = TreeNode(6)
    a7 = TreeNode(8)
    a1.left = a2
    a1.right = a3
    a2.left = a4
    a2.right = a5
    a3.left = a6
    a3.right = a7
    PastOrder(a1)
    print(houxu)
    print(Past_Order(a1))

 

4, preorder capa

class TreeNode:
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None
        self.parent = None

def Level_Order(root):
    if not root:
        return
    data = []
    queue = []
    queue.append(root)
    while queue: # 队列不为空,说明还没遍历完
        front = queue.pop(0) # 队列先进先出
        if front.left:
            queue.append(front.left) # 进左子节点
        if front.right:
            queue.append(front.right) # 进有右子节点
        data.append(front.val)
    return data

if __name__ == '__main__':
    a1 = TreeNode(5)
    a2 = TreeNode(3)
    a3 = TreeNode(7)
    a4 = TreeNode(2)
    a5 = TreeNode(4)
    a6 = TreeNode(6)
    a7 = TreeNode(8)
    a1.left = a2
    a1.right = a3
    a2.left = a4
    a2.right = a5
    a3.left = a6
    a3.right = a7
    print(Level_Order(a1))

 

Publicado 44 artículos originales · elogios ganado 16 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/YYIverson/article/details/100887905
Recomendado
Clasificación