数据结构----树的遍历方式 [前、中、后序、层次遍历](python3)

树的 遍历大类分成 [深度优先][广度优先] 

其中 [深度优先] 又分为最常用的:前序遍历,中序遍历,后序遍历。

前序遍历:(根左右)

前序遍历可以简单记成“根左右”,就是先遍历根结点,再按深度遍历根的左、右结点。如上图所示。

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

def preorder(root): #前序遍历
    if root == None:return
    print(root.val)
    if root.left:
        preorder(root.left)
    if root.right:
        preorder(root.right)

def createTree(): #创建树
    node = TreeNode(1)
    leftNode = TreeNode(2)
    rightNode = TreeNode(3)
    node.left = leftNode
    node.right = rightNode
    return node

tree = createTree()
preorder(tree) #1 2 3

时间复杂度:O(N),因为每个结点都被无重复地遍历了一次。

空间复杂度:O(h),h为树高,因为在往下遍历时,栈都会保存当前结点的所有祖先结点。

中序遍历:(左根右)

中序遍历可以简单记成“左根右”,就是先遍历根的左结点,再遍历根结点和根的右结点。如上图所示。

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

def midorder(root): #中序遍历
    if root == None:return
    if root.left:
        midorder(root.left)
    print(root.val)
    if root.right:
        midorder(root.right)

def createTree(): #创建树
    node = TreeNode(1)
    leftNode = TreeNode(2)
    rightNode = TreeNode(3)
    node.left = leftNode
    node.right = rightNode
    return node

tree = createTree()
midorder(tree) #2 1 3

时间复杂度:O(N),因为每个结点都被无重复地遍历了一次。

空间复杂度:O(h),h为树高,因为在往下遍历时,栈都会保存当前结点的所有祖先结点。

后序遍历:(左右根)

后序遍历可以简单记成“左右根”,就是先遍历根的左结点、右结点,再遍历根结点。如上图所示。

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

def endorder(root): #后序遍历
    if root == None:return
    if root.left:
        endorder(root.left)
    if root.right:
        endorder(root.right)
    print(root.val)

def createTree(): #创建树
    node = TreeNode(1)
    leftNode = TreeNode(2)
    rightNode = TreeNode(3)
    node.left = leftNode
    node.right = rightNode
    return node

tree = createTree()
endorder(tree) #2 3 1

时间复杂度:O(N),因为每个结点都被无重复地遍历了一次。

空间复杂度:O(h),h为树高,因为在往下遍历时,栈都会保存当前结点的所有祖先结点。

结论:其实可以看出,深度优先遍历的三种(前序、中序、后序)遍历都是时间复杂度为O(N),空间复杂度为O(h)

-------------------------------------------------------------

广度优先遍历:

广度优先遍历也叫层次遍历,就是按顺序一层层地打印结点。如上图所示。

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

def graorder(root):
    if root == None:return
    queue = [root]
    while queue:
        res=[]
        for item in queue:
            print(item.val)
            if item.left:
                res.append(item.left)
            if item.right:
                res.append(item.right)
        queue = res

def createTree(): #创建树
    node = TreeNode(1)
    leftNode = TreeNode(2)
    rightNode = TreeNode(3)
    node.left = leftNode
    node.right = rightNode

    return node

tree = createTree()
graorder(tree) #2 3 1

时间复杂度都是O(N),因为它们只访问每个节点一次,不存在多余的访问。

空间复杂度是O(w),w是树每一层的最大宽度(拥有最多节点的层的节点数),因为层次遍历通常是用一个queue来实现的。

发布了278 篇原创文章 · 获赞 470 · 访问量 82万+

猜你喜欢

转载自blog.csdn.net/u014453898/article/details/105291886