• 树结构的遍历算法(文件目录的遍历)



    假设存在这样一个目录:
    文件目录
    这是一个树结构,需要遍历它!

    一、递归遍历

    1.代码
    #Authors:xiaobei
    
    import os
    #递归遍历,其实也是深度遍历
    def GetAllDir(path,tag = ""):                           #tag用作层次标记
        fileList = os.listdir(path)
        for filename in fileList:
            file_abs_path = os.path.join(path,filename)     #合成绝对路径
            if os.path.isdir(file_abs_path):                #判断是否为目录。若是调用自身递归遍历,递归的出口是“该路径为文件”
                print(tag+"<目录>:",filename)
                GetAllDir(file_abs_path,tag = tag+"     ")  #递归调用
            else:
                print(tag+"<文件>:",filename)
    path = r"F:untitledDir1"
    GetAllDir(path)
    2.遍历结果

    递归遍历
    (说明:递归处理,优先处理目录,向深处延伸。从输出结果可以看出,错落有致的层级关系。)

    二、栈模拟遍历

    1.代码
    #Authors:xiaobei
    
    import os
    #用栈模拟递归遍历
    def GetAllDir(path):
        stack = []                              #创建空栈
        stack.append(path)                      #当栈为空的时候,结束循环
        while(len(stack)!=0):                   #循环从栈中取出文件路径(出栈)
            dirPath = stack.pop()               #stack。pop()默认把栈中最后一个元素删除,并返回第一个元素值,符合栈的“先进后出原则
            if(os.path.isfile(dirPath)):
                print("<文件>:",os.path.basename(dirPath))
            else:
                print("<目录>:",os.path.basename(dirPath))
                fileList = os.listdir(dirPath)
                for filename in fileList:       #循环找到路径下的文件,并压入栈中(文件入栈)
                    file_abs_path = os.path.join(dirPath,filename)      #使用绝对路径
                    if(os.path.isfile(file_abs_path)):
                        stack.append(file_abs_path)                     #如果是文件就等待稍后处理
                for filename in fileList:       #循环找到路径下的目录,并在文件之后压如栈中(由于栈“先进后出”的性质,优先处理目录)
                    file_abs_path = os.path.join(dirPath,filename)      #使用绝对路径
                    if(os.path.isdir(file_abs_path)):
                        stack.append(file_abs_path)
    path = r"F:untitledDir1"
    GetAllDir(path)
    2.遍历结果

    栈模拟递归
    (说明:根据栈的特性,文件的出栈顺序是正确的,优先处理目录,向深处延伸。有于没有加层级区分,所以输出并齐。)

    三、队列模拟遍历

    1.代码
    #Authors:xiaobei
    
    import os,collections
    #用队列遍历目录
    def GetAllDir(path,tag = ""):
        queue = collections.deque()             #创建空队列
        queue.append(path)
        while(len(queue)!=0):                   #当队列为空,结束循环
            dirPath = queue.popleft()           #出队
            fileList = os.listdir(dirPath)      #获取路径文件列表 
            for filename in fileList:
                file_abs_path = os.path.join(dirPath,filename)  #使用绝对路径
                if(os.path.isdir(file_abs_path)):
                    print(tag+"<目录>:",filename)                #如果是目录则(入队)
                    queue.append(file_abs_path)
                else:
                    print(tag+"<文件>:",filename)                #如果是文件则进行操做
            tag += "      "
    path = r"F:untitledDir1"
    GetAllDir(path)
    
    2.遍历结果

    队列遍历
    (说明:由于队列的特性,优先处理同一层级所有文件,水平延伸。从输出结果可以看出,同一层级的相对齐。)

    四、深度遍历

    1.理解

    优先遍历下一层级

    树

    入栈顺序:A–>B–>C–>E–>F->D
    出栈顺序:A–>C–>F–>E–>B–>D

    2.示意图

    栈示意图

    五、广度遍历

    1.理解

    优先遍历同一层级
    树

    入队顺序:A–>B–>C–>D–>E–>F
    出队顺序:A–>B–>C–>D–>E–>F

    2.示意图

    队列示意图

  • 相关阅读:
    测试之美-1
    杯子测试
    性能面试(四)
    性能面试(二)
    性能面试(三)
    性能面试(一)
    解决用户名冲突
    版本冲突
    JQuery Easy UI 简介
    Fork
  • 原文地址:https://www.cnblogs.com/slz99/p/12527743.html
Copyright © 2020-2023  润新知