二叉树深度DFS:前中后序:递归与迭代 & 层次遍历BFS

二叉树构建:html

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


l1 = TreeNode(3) 
l1.left = TreeNode(2)
l1.right = TreeNode(5)
l1.left.left = TreeNode(7)

一、BFSnode

def breadth_travel(root):
    '''利用队列实现树的层次遍历'''
    if root == None: root
    queue = []
    queue.append(root)
    while queue:
        node = queue.pop(0)
        print (node.val)
        if node.left != None:
            queue.append(node.left)
        if node.right != None:
            queue.append(node.right)


            

二、 DFS(前中后序)
a、前序app

#递归
#前
def preTraversal(root):
    if not root:
        return []
    return  [root.val] + preTraversal(root.left)  + preTraversal(root.right)

#迭代
def levelOrderBottom(root):
    """
    先序遍历
    :param root: 根节点
    :return: list_node -> List
    """
    stack_node = [root]  # 栈
    print(stack_node)
    list_node = []  # 先序遍历结果存放列表

    while stack_node: # 栈不为空
        node = stack_node.pop() # 栈顶节点出栈
        if not node: # 节点为空
            continue
        list_node.append(node.val) # 把不为空的节点数值存到列表
        stack_node.append(node.right) # 右节点先压栈
        stack_node.append(node.left) # 左节点后压栈
    print(list_node)


b、中post

#递归
def inorderTraversal(root):
    if not root:
        return []
    return inorderTraversal(root.left) + [root.val] + inorderTraversal(root.right)

#迭代
def levelOrderBottom(root):
    """
    中序遍历 非递归
    :param root:  根节点
    :return: list_node -> List
    """
    stack_node = []  # 栈
    list_node = []  # 中序遍历结果存放列表
    node_p = root # 当前节点
    while stack_node or node_p: # 当前节点不为空 or 栈不为空

        while node_p: # 一直移动到最左端
            stack_node.append(node_p) # 节点压栈
            node_p = node_p.left # 指针左移

        node = stack_node.pop() # 出栈 
        list_node.append(node.val) # 获取节点数据 
        node_p = node.right # 获取有节点
    print(list_node)


c、后指针

#递归
def postTraversal(root):
    if not root:
        return []
    return  postTraversal(root.left)  + postTraversal(root.right) + [root.val] 


#迭代
def levelOrderBottom(root):
    """
    后序遍历 非递归
    :param root: 根节点
    :return: list_node -> List
    """
    stack_node = [root]
    list_node = []

    while stack_node:
        node = stack_node.pop()

        if node.left: # 左孩子不为空
            stack_node.append(node.left) # 左孩子压栈
        if node.right: # 右孩子不为空
            stack_node.append(node.right) # 右孩子压栈

        list_node.append(node.val) # 获取当前指针数值

    list_node.reverse() # 取反

他们此刻正躲在距离战场六七十里外的海面上,缩着身子,敛着查克拉,努力隐藏着自身的存在,像是在窥视巨象打架的蝼蚁。海面上波澜起伏,战斗的余波不时会掀起异常的浪头,隆多两人弓着腰的身影在海浪中若隐若现,隐匿成两个不起眼的小黑点。https://www.mbgtxt.com/28_28099/16881188.htmlcode