二叉树

leetcode刷题的时候遇到关于二叉树的问题,这里做一个整理。

概要:

二叉树的搜索主要分为深度优先搜索(DFS)和广度优先搜索(BFS)。其中深度优先搜索中又分为:前序遍历(preOrder)、中序遍历(inOrder)后后序遍历(postOrder)。二叉树的遍历通常使用递归算法或者栈来实现。

1. 深度优先搜索

(1)前序遍历: 遵循根->左->右的顺序

#递归方法
def preOrder(root):
    if not root:
        return
    print(root.val)
    preOrder(root.left)
    prtOrder(root.right)

#利用栈的迭代方法
def preOrder(root):
    stack = [root]    #定义一个列表
    while(stack):
        ptr = stack.pop()    #出栈
        if ptr:
            print(ptr.val)
            stack.append(ptr.right)
            stack.append(ptr.left)

(2) 中序遍历:遵循左->根->右的顺序

#递归方法
def inOrder(root):
    if not root:
        return
    inOrder(root.left)
    print(root.val)
    inOrder(root.right)

#迭代方法
def inOrder(root):
    stack = [root]
    while(stack or root):
        while(root):
            stack.append(root.val)
            root = root.left    #遍历完左子树    
        root = stack.pop()    #保存当前节点,因为还要继续遍历这个节点的右孩子
        print(root.val)
        root = root.right

(3)后序遍历:遵循左->右->根的顺序。

#递归方法
def postOrder(root):
    if not root:
        return
    postOrder(root.left)
    postOrder(root.right)
    print(root.val)

#迭代方法
def postOrder(root):
    stack = []
    last_visit = null
    while(root or !stack.empty()):
        while(root):
            stack.append(root)
            root = root.left
        top = stack.top()    #取出栈顶元素
        if (top.right ==null or last_visit == top.right):  #因为访问根节点时肯定是从其右孩子返回的
            stack.pop()
            print(top.data)
            last_visit = top
        else:
            root = root.right

 

posted @ 2020-03-01 15:14  eltShawn  阅读(138)  评论(0)    收藏  举报