• 【数据结构】:树的先序,中序,后序遍历Python实现


    我们先建立一棵简单的二叉树:

     代码如下所示:

    class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    
    l1 = TreeNode(1)
    l2 = TreeNode(2)
    l3 = TreeNode(3)
    l4 = TreeNode(4)
    l5 = TreeNode(5)
    l6 = TreeNode(6)
    l7 = TreeNode(7)
    
    l1.left = l2
    l1.right = l3
    l2.left = l4
    l2.right = l5
    l3.left = l6
    l3.right = l7

    然后进行先序遍历:

    def pretravale(treenode):
        if treenode==None:
            return None
        print(treenode.val)
        pretravale(treenode.left)
        pretravale(treenode.right)

    中序:

    #利用深度优先搜索进行中序遍历
    def midtravale(treenode):
        if treenode==None:
            return None
        midtravale(treenode.left)#先往左走到底,然后打印根节点
        print(treenode.val)
        midtravale(treenode.right)

    后序:

    def latetravale(treenode):
        if treenode == None:
            return None
        latetravale(treenode.left)
        latetravale(treenode.right)
        print(treenode.val)

    打印遍历结果:

    pretravale(l1)
    print("开始中序遍历")
    midtravale(l1)
    print("开始后序便遍历")
    latetravale(l1)

    得到:

    1
    2
    4
    5
    3
    6
    7
    开始中序遍历
    4
    2
    5
    1
    6
    3
    7
    开始后序便遍历
    4
    5
    2
    6
    7
    3
    1

    当然面试官看到你使用递归解法来遍历这棵树肯定是不满意的,因此这里给出对这棵树的迭代解法,首先是先序遍历,在遍历的时候我们可以一直往左进行入栈,当栈中没有元素可以添加之后,也就是树的左端的元素已经没了变成了None,那么我们弹出最尾端的元素,如果说最尾端有元素的话就再次对最尾端的元素的left进行遍历,如果没有则返回到上一级的树根。

    #  使用非递归的方式进行先序遍历
    def preOrder(root):
        if root==None:
            return None
        stack=[]
        tmpNode=root
        while tmpNode or stack:#不能为空
            while tmpNode:
                print(tmpNode.val)
                stack.append(tmpNode)
                tmpNode=tmpNode.left#继续找这个跟节点的左子树
                #将左子树一直放到里面,直到没有左子树
    
            node = stack.pop()
            tmpNode = node.right# 假设node.right为空则tmpNode也为空
            #如果不为空的话,那么node.right就赋值给新的tmpNode

    中序遍历我们改变一下打印的顺序就好了,毕竟都是深度优先搜索(DFS):

    #中序遍历
    def midOrder(root):
        if root==None:
            return None
        stack=[]
        tmpNode=root
        while tmpNode or stack:#不能为空
            while tmpNode:
                #print(tmpNode.val)
                stack.append(tmpNode)
                tmpNode=tmpNode.left#继续找这个跟节点的左子树
                #将左子树一直放到里面,直到没有左子树
    
            node = stack.pop()
            print(node.val)
            tmpNode = node.right# 假设node.right为空则tmpNode也为空
            #如果不为空的话,那么node.right就赋值给新的tmpNode

    后续遍历的迭代解法可以留给大家自己去思考

  • 相关阅读:
    C++ template —— 类型区分(十一)
    C++ template —— 表达式模板(十)
    C++ template —— template metaprogram(九)
    C++ template —— 模板与继承(八)
    [转]2015有得有悟,2016笨鸟起飞
    C++ template —— trait与policy类(七)
    protobuf与json相互转换的方法
    如何通过卡面标识区分SD卡的速度等级
    MyEclipse设置字体和背景的方法
    JAVA中日期转换和日期计算的方法
  • 原文地址:https://www.cnblogs.com/geeksongs/p/13557684.html
Copyright © 2020-2023  润新知