2024-9.python文件操作

news2024/12/24 3:09:51

文件操作

引言
  • 到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢?现在你是否感觉你的编程技巧还缺了点什么呢?是的,我们还缺少将数据在本地文件系统进行持久化的能力,白话讲就是文件的读写能力。
文件打开
  • Python内置了一个open()方法,用于对文件进行读写操作。使用open()方法操作文件就像把大象塞进冰箱一样,可以分三步走,一是打开文件,二是操作文件,三是关闭文件。

  • 文件句柄/文件描述符

    • open()方法的返回值是一个file对象,可以将它赋值给一个变量,这个变量就是所谓的文件句柄。
    • file对象:
      • 可以调用read()和write()方法,对打开的文件进行读写操作。
  • open方法的语法

    • f = open(filename, mode)
      • filename:
        • 一个包含了你要访问的文件名称的字符串值,通常是一个文件路径。
      • mode:
        • 打开文件的模式,有很多种,默认是只读方式r。
  • 文件打开的模式:

  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 常规文件打开模式操作演示

    • b模式:
      • 二进制模式,通常用来读取图片、视频等二进制文件。注意,它在读写的时候是以bytes类型读写的,因此获得的是一个bytes对象而不是字符串。在这个读写过程中,需要自己指定编码格式。在使用带b的模式时一定要注意传入的数据类型,确保为bytes类型。
    • +模式:
      • 对于w+模式,在读写之前都会清空文件的内容,建议不要使用!
      • 对于a+模式,永远只能在文件的末尾写入,有局限性!
      • 对于r+模式,也就是读写模式,配合seek()和tell()方法,可以实现更多操作。
  • 编码问题

    • 要读取非UTF-8编码的文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件
    • 遇到有些编码不规范的文件,可能会抛出UnicodeDecodeError异常,这表示在文件中可能夹杂了一些非法编码的字符。遇到这种情况,可以提供errors=’ignore‘参数,表示如果遇到编码错误后如何处理。
文件对象操作
  • 每当我们用open方法打开一个文件时,将返回一个文件对象。这个对象内置了很多操作方法。

  • f.read(size) #size读取数据的个数

    • 读取一定大小的数据, 然后作为字符串或字节对象返回。size是一个可选的数字类型的参数,用于指定读取的数据量。当size被忽略了或者为负值,那么该文件的所有内容都将被读取并且返回。
    • 注意:
      • 如果文件体积较大,请不要使用read()方法一次性读入内存,而是read(512)这种一点一点的读。
  • f.readline()

    • 从文件中读取一行n内容。换行符为’\n’。如果返回一个空字符串,说明已经已经读取到最后一行。这种方法,通常是读一行,处理一行,并且不能回头,只能前进,读过的行不能再读了。
  • f.readlines()

    • 将文件中所有的行,一行一行全部读入一个列表内,按顺序一个一个作为列表的元素,并返回这个列表。readlines方法会一次性将文件全部读入内存,所以也存在一定的风险。但是它有个好处,每行都保存在列表里,可以随意存取。
  • #需求:读取文件中的数据
    fp = open('./test.txt','r')
    text = fp.read(10) #读取指定字节的数据
    text_line = fp.readline() #一次读取一行数据
    text_lines = fp.readlines() #读取多行数据,返回一个列表
    print(text_lines)
    fp.close()
    
  • 总结:

    • 几种不同的读取和遍历文件的方法比较:如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。普通情况,使用for循环更好,速度更快。
  • f.write()

    • 将字符串或bytes类型的数据写入文件内。write()动作可以多次重复进行,其实都是在内存中的操作,并不会立刻写回硬盘,直到执行close()方法后,才会将所有的写入操作反映到硬盘上。在这过程中,如果想将内存中的修改,立刻保存到硬盘上,可以使用f.flush()方法。

    • fp = open('./test123.txt','w')
      fp.write('hello bobo')
      fp.close() #将文件内容清空,在写入新数据
      
      
    • fp = open('./test123.txt','a')
      fp.write('hello bobo')
      fp.close() #在文件数据末尾追加数据
      
      
  • f.tell()

    • 返回文件读写指针当前所处的位置,它是从文件开头开始算起的字节数。一定要注意了,是字节数,不是字符数。

    • fp = open('./test123.txt','w')
      # fp.write('hello bobo')
      print(fp.tell())
      fp.close()
      
  • f.seek()

    • 如果要改变文件指针的位置, 可以使用f.seek(offset, from_what)方法。seek()经常和tell()方法配合使用。

    • from_what

      • 如果是0表示从文件开头计算
      • 如果是1表示从文件读写指针的当前位置开始计算
      • 2表示从文件的结尾开始计算,默认为0
    • offset:表示偏移量

      • seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字节
      • seek(x,1) : 表示从当前位置往后移动x个字节
      • seek(-x,2):表示从文件的结尾往前移动x个字节
      fp = open('./test.txt','r')
      fp.seek(9,0)
      text = fp.read(5)
      print(text)
      fp.close()
      
  • f.close()

    • 关闭文件对象。当处理完一个文件后,调用f.close()来关闭文件并释放系统的资源。文件关闭后,如果尝试再次调用该文件对象,则会抛出异常。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了,或者更糟糕的结果。也就是说大象塞进冰箱后,一定不要忘记关上冰箱的门。
with关键字

with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。注意缩进。

with open('./test123.txt','r') as fp: #fp = open()
    text = fp.read(5)
print(text)

#上下两组代码功效一样
fp = open('./test123.txt','r')
text = fp.read(5)
print(text)
fp.close()

简易图书管理系统

  • 注册功能
  • 登录功能
  • 图书的录入
  • 图书的删除
  • 图书的修改操作
  • 图书的查询操作
注册实现
  • 1.判定两次密码一致,则注册成功
def regist():
    print('欢迎来到注册页面')
    print('-------------')
    username = input('enter username:')
    password = input('enter password:')
    repeatpwd = input('repeat enter password:')
    email = input('enter email:')
    #判定用户的注册状态
    if password == repeatpwd:
        with open('./userData.txt','a') as fp:
            #bobo-123-123@qq.com
            #jay-456-456@qq.com
            fp.write(username+'-'+password+'-'+email+'\n')
            print('注册成功!')
    else:
        print('两次密码不一致,注册失败!')
def login():
    pass

def main_view():
    print('欢迎来到xxx管理系统')
    print('----------------')
    print('1.登录\n2.注册\n3.退出')
    choose = input('请选择功能:')
    if choose == '1':
        login()
    elif choose == '2':
        regist()
    elif choose == '3':
        exit() #退出整个程序
    else:
        print('输入有误,程序退出!')
 

main_view()
  • 在两次密码一致的情况下,在验证用户名是否重复

  • def regist():
        print('欢迎来到注册页面')
        print('-------------')
        username = input('enter username:')
        password = input('enter password:')
        repeatpwd = input('repeat enter password:')
        email = input('enter email:')
        #判定用户的注册状态
        if password == repeatpwd:
            isHave = False#用户名是否重复的状态显示,isHave==True表示用户名重复
            with open('./userData.txt','r+') as fp:
                #bobo-123-123@qq.com
                #jay-456-456@qq.com
                #读取文件中所有注册用户的用户名
                user_data_list = fp.readlines()
                for user_data in user_data_list:
                    userName = user_data.split('-')[0]
                    if username == userName:#用户名重复
                        isHave = True
                if isHave == False:  
                    fp.write(username+'-'+password+'-'+email+'\n')
                    print('注册成功!')
                else:
                    print('注册失败,%s用户名已被占用!'%username)
        else:
            print('两次密码不一致,注册失败!')
    def login():
        pass
    
    def main_view():
        print('欢迎来到xxx管理系统')
        print('----------------')
        print('1.登录\n2.注册\n3.退出')
        choose = input('请选择功能:')
        if choose == '1':
            login()
        elif choose == '2':
            regist()
        elif choose == '3':
            exit() #退出整个程序
        else:
            print('输入有误,程序退出!')
     
    
    main_view()
    
    登录功能实现
    import time
    def regist():
        print('\n\n欢迎来到注册页面')
        print('-------------')
        username = input('enter username:')
        password = input('enter password:')
        repeatpwd = input('repeat enter password:')
        email = input('enter email:')
        #判定用户的注册状态
        if password == repeatpwd:
            isHave = False#用户名是否重复的状态显示,isHave==True表示用户名重复
            with open('./userData.txt','r+') as fp:
                #bobo-123-123@qq.com
                #jay-456-456@qq.com
                #读取文件中所有注册用户的用户名
                user_data_list = fp.readlines()
                for user_data in user_data_list:
                    userName = user_data.split('-')[0]
                    if username == userName:#用户名重复
                        isHave = True
                if isHave == False:  
                    fp.write(username+'-'+password+'-'+email+'\n')
                    print('注册成功,三秒后自动跳转到登录页面......')
                    time.sleep(3) #暂停三秒
                    login()
                else:
                    print('注册失败,%s用户名已被占用!'%username)
                    print('是否重新注册?y/n')
                    c = input('enter your choose:')
                    if c == 'y' or c == 'Y':
                          regist()
                    else:
                         exit() 
        else:
            print('两次密码不一致,注册失败!')
    def login():
        print('\n\n欢迎来到登录页面')
        print('-------------')
        username = input('enter username:')
        password = input('enter password:')
        #判定登录状态
        login_state = False
        with open('./userData.txt','r') as fp:
            user_data_list = fp.readlines()
            for user_data in user_data_list:
                un = user_data.split('-')[0]
                pw = user_data.split('-')[1]
                if username == un and password == pw:
                    login_state = True
                    break
                    
            if login_state == True:
                print('登录成功')
            else:
                print('登录失败,是否返回主页面?y/n')
                c = input('enter your choose:')
                if c == 'y' or c == 'Y':
                    main_view()
                else:
                    exit()
    def findPwd():
        un = input('enter your username:')
        em = input('enter your email')
        with open('./userData.txt','r') as fp:
            isFind = False
            user_data_list = fp.readlines()
            for user_data in user_data_list:
                username = user_data.split('-')[0]
                email = user_data.split('-')[2]
                #将email中的回车去掉
                email = email.strip()
                if username == un and email == em:
                    password = user_data.split('-')[1]
                    print('找回的密码为:',password)
                    isFind = True
                    break
            if isFind == False:
                print('密码找回失败,用户名和邮箱不匹配!')
    def main_view():
        print('欢迎来到xxx管理系统')
        print('----------------')
        print('1.登录\n2.注册\n3.找回密码\n4.退出')
        choose = input('请选择功能:')
        if choose == '1':
            login()
        elif choose == '2':
            regist()
        elif choose == '3':
            findPwd() 
        elif choose == '4':
            return #退出整个程序
        else:
            print('输入有误,程序退出!')
     
    
    main_view()
    
    拓展内容:python访问链接数据库
    import pymysql #需要单独pip install pymysql进行安装
    #1.链接数据库
    conn = pymysql.Connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = 'boboadmin',
        db = 'AnHui',
        charset = 'utf8'
    )
    
    #2.创建一个游标对象(用来执行sql语句)
    cursor = conn.cursor()
    
    #3.可以通过创建好的游标对象执行相关的sql语句
    #sql = 'delete from userData where username="tom"'
    sql = 'insert into userData (username,password,email) values ("tom","333","333@qq.com")'
    cursor.execute(sql)
    
    #4.事物的处理
    conn.commit()
    
    import pymysql
    #1.链接数据库
    conn = pymysql.Connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = 'boboadmin',
        db = 'AnHui',
        charset = 'utf8'
    )
    
    #2.创建一个游标对象(用来执行sql语句)
    cursor = conn.cursor()
    
    #3.可以通过创建好的游标对象执行相关的sql语句
    #查询数据
    sql = 'select * from userData'
    cursor.execute(sql)
    result = cursor.fetchall()
    print(result)
    
    #4.事物的处理
    conn.commit()
    

管理系统完整实现:

import time
def regist():
    print('\n\n欢迎来到注册页面')
    print('-------------')
    username = input('enter username:')
    password = input('enter password:')
    repeatpwd = input('repeat enter password:')
    email = input('enter email:')
    #判定用户的注册状态
    if password == repeatpwd:
        isHave = False#用户名是否重复的状态显示,isHave==True表示用户名重复
        with open('./userData.txt','r+') as fp:
            #bobo-123-123@qq.com
            #jay-456-456@qq.com
            #读取文件中所有注册用户的用户名
            user_data_list = fp.readlines()
            for user_data in user_data_list:
                userName = user_data.split('-')[0]
                if username == userName:#用户名重复
                    isHave = True
            if isHave == False:  
                fp.write(username+'-'+password+'-'+email+'\n')
                print('注册成功,三秒后自动跳转到登录页面......')
                time.sleep(3) #暂停三秒
                login()
            else:
                print('注册失败,%s用户名已被占用!'%username)
                print('是否重新注册?y/n')
                c = input('enter your choose:')
                if c == 'y' or c == 'Y':
                      regist()
                else:
                     exit() 
    else:
        print('两次密码不一致,注册失败!')
def insertBook():
    title = input('插入图书的名称:')
    publish_date = input('插入图书的出版时间:')
    author = input('插入图书的作者:')
    publish = input('插入图书的出版社:')
    with open('./bookData.txt','a') as fp:
        fp.write(title+'-'+publish_date+'-'+author+'-'+publish+'\n')
    print(title,'插入成功!')
    print('是否继续插入?y/n')
    c = input('enter your choose:')
    if c == 'y' or c == 'Y':
        insertBook()
    else:
        manageView()
def showBooks():
    print('\n\n')
    with open('./bookData.txt','r') as fp:
        book_list = fp.readlines()
        for book in book_list:
            print(book)
    c = input('返回主页面请按1:')
    if c == '1':
        manageView()
def deleteBook():
    #指定一个删除的条件
    name = input('请输入即将要删除的图书名称:')
    with open('./bookData.txt','r') as fp:
        book_list = fp.readlines()
    for book in book_list:
        if name in book:
            book_list.remove(book)
    
    fp = open('./bookData.txt','w')
    for book in book_list:
        fp.write(book)
    fp.close()
    print(name,'被成功删除!3秒后自动跳转会主页面......')
    time.sleep(3)
    manageView()
def updateBook():
    name = input('请输入即将要修改图书的名字:')
    with open('./bookData.txt','r') as fp:
        book_list = fp.readlines()
    for book in book_list:
        if name in book:
            old_author = book.split('-')[2]
            new_author = input('请输入新的作者名称:')

            new_book = book.replace(old_author,new_author)
            book_list.append(new_book)
            book_list.remove(book)
            break
    fp = open('./bookData.txt','w')
    for book in book_list:
        fp.write(book)
    print('图书修改成功!等待3秒返回主页面......')
    fp.close()
    time.sleep(3)
    manageView()
    
            
            
            
            
        
def manageView():
    print('\n\n欢迎来到管理系统')
    print('1.查看所有图书\n2.插入图书\n3.删除图书\n4.修改图书\n5.返回主页面\n')
    choose = input('enter your choose:')
    if choose == '1':
        showBooks()
    elif choose == '2':
        insertBook()
    elif choose == '3':
        deleteBook()
    elif choose == '4':
        updateBook()
    else:
        main_view()
def login():
    print('\n\n欢迎来到登录页面')
    print('-------------')
    username = input('enter username:')
    password = input('enter password:')
    #判定登录状态
    login_state = False
    with open('./userData.txt','r') as fp:
        user_data_list = fp.readlines()
        for user_data in user_data_list:
            un = user_data.split('-')[0]
            pw = user_data.split('-')[1]
            if username == un and password == pw:
                login_state = True
                break
                
        if login_state == True:
            manageView()
        else:
            print('登录失败,是否返回主页面?y/n')
            c = input('enter your choose:')
            if c == 'y' or c == 'Y':
                main_view()
            else:
                exit()
def findPwd():
    un = input('enter your username:')
    em = input('enter your email')
    with open('./userData.txt','r') as fp:
        isFind = False
        user_data_list = fp.readlines()
        for user_data in user_data_list:
            username = user_data.split('-')[0]
            email = user_data.split('-')[2]
            #将email中的回车去掉
            email = email.strip()
            if username == un and email == em:
                password = user_data.split('-')[1]
                print('找回的密码为:',password)
                isFind = True
                break
        if isFind == False:
            print('密码找回失败,用户名和邮箱不匹配!')
def main_view():
    print('欢迎来到xxx管理系统')
    print('----------------')
    print('1.登录\n2.注册\n3.找回密码\n4.退出')
    choose = input('请选择功能:')
    if choose == '1':
        login()
    elif choose == '2':
        regist()
    elif choose == '3':
        findPwd() 
    elif choose == '4':
        return #退出整个程序
    else:
        print('输入有误,程序退出!')
 

main_view()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集合-CollectionListSet

Collection体系的特点、使用场景总结 如果希望元素可以重复,又有索引,索引查询要快? 用ArrayList集合, 基于数组的。(用的最多) 如果希望元素可以重复,又有索引,增删首尾操作快? 用LinkedList集合, 基于链表的。 如果希望增…

64B/66B编码 自定义PHY层设计

一、前言 之前的一篇文章讲解了64B/66B的基本原理,本篇在基于64B/66B GT Transceiver的基础之上设计自定义PHY。基本框图如下。 二、GT Mdule GT Module就按照4个GT CHannel共享一个GT COMMON进行设置,如下图。要将例子工程中的GT COMMON取出&#xff…

win10 鼠标箭头自己乱动解决方案

我这里只说我碰到的然后我的解决方案,不一定对其他问题有效; 1. 首先拔掉鼠标线查看鼠标箭头是否仍然在乱动,如果是则非鼠标问题,如果不再乱动则是鼠标的问题;验证非鼠标问题; 2. 因为鼠标乱动跟鼠标无关…

Transformer杀疯了!王炸成果荣登Nature,实现无限上下文长度

继DeepMind的新设计MoD大幅提升了 Transformer 效率后,谷歌又双叒开始爆改了! 与之前荣登Nature子刊的life2vec不同,谷歌的新成果Infini-attention机制(无限注意力)将压缩内存引入到传统的注意机制中,并在…

python--4函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、递归练习

学习目标: 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 学习内容: 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 …

CSS中position属性总结

CSS中position属性的总结 如果我的文章看不懂,不要犹豫,请直接看阮一峰大佬写的文章 https://www.ruanyifeng.com/blog/2019/11/css-position.html 1 干嘛用的 用来定位HTML元素位置的,通过top、bottom、right、left定位元素 分别有这些值&a…

3D模型格式转换工具HOOPS Exchange:3D CAD数据的快速导入与导出

在当今的工程设计领域中,快速且可靠地处理3D CAD数据是至关重要的。HOOPS Exchange SDK通过提供一组C软件库,为开发团队提供了实现这一目标的有效工具。 什么是HOOPS Exchange? HOOPS Exchange是一组C软件库,旨在为开发团队提供…

DNS服务器的管理与配置

目录 一、相关知识 域名空间 DNS服务器分类 域名解析过程 资源记录 二、安装DNS服务 安装bind软件包 DNS服务的启动与停止 配置主要名称服务器 主配置文件 从例子学起: (1)建立主配置文件named.conf (2)…

OpenHarmony网络协议通信c-ares [交叉编译]异步解析器库

简介 c-ares是异步解析器库,适用于需要无阻塞地执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。 下载安装 直接在OpenHarmony-SIG仓中搜索c-ares并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的c-ares库代码存在以下路径:…

上位机图像处理和嵌入式模块部署(树莓派4b实现固件主流程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 软件开发一般有软件需求、架构设计和详细设计、软件测试这四个部分。软件需求和软件测试都比较好理解,前者是说要实现哪些功能&#xf…

【SpringBoot+VUE+ELEMENT 】前后端分离的管理系统的实现——基础功能(记录向)

一个前后端分离的实现。后端使用SpringBoot,前端使用Vue,后端标准的四层结构,前端是用的Element。 一、环境准备 1.安装node.js Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 成功后cmd中运行 node -v npm -v 出现 对应的版本…

活动 | 华院计算与数学家一起走进世界轨道交通之都-中国株洲

4月17日,由株洲市人民政府主办、株洲高新区管委会承办,华院计算技术(上海)股份有限公司(以下简称“华院计算”)协办的“制造名城、院士同行,数学家走进株洲”活动在湖南株洲举行。 来自中国数学…

匿名函数与gorm中的Transaction事务方法

整理下go中的匿名函数,项目中很多地方都在用。 1、函数类型的变量 Go中,函数也是一种数据类型。定义一个函数,把这个函数赋值给一个变量,这个变量就是函数类型的变量,用这个变量等价于直接调函数: packa…

算法刷题记录2

4.图 4.1.被围绕的区域 思路:图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归,找与边界O联通的O,并标记为#(代表已遍历),最后图中剩下的O就是:被X包围的O。图中所有…

使用LVGL提升交互效率:基于启明智显Model3A方案的7寸智能屏用户界面(UI)设计介绍

项目概述: 【启明智显】,作为一家专注于HMI和AIoT解决方案的公司,我们致力于为用户提供创新、可靠且高效的产品和解决方案。近日我们推出了高性能及高性价比的HMI芯片——Model3A。芯片搭载了强大的2D图形加速引擎,能够提供高达7…

RNN知识体系构筑:详尽阐述其理论基础、技术架构及其在处理序列数据挑战中的创新应用

一、为什么需要RNN 尽管神经网络被视为一种强大且理论上能够近似任何连续函数的模型,尤其当训练数据充足时,它们能够在输入空间中的某个点( x )映射到输出空间的特定值( y ),然而,这并不能完全解释为何在众多应用场景中&#xff…

基于Spring Boot的新生宿舍管理系统设计与开发

基于Spring Boot的新生宿舍管理系统设计与开发 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 报修处理管理界面图,在报修处理管理页面…

QA测试开发工程师面试题满分问答16: 微信输入框如何设计测试用例?

可以涵盖基础功能、用户交互、编辑撤回、权限相关、网络信号、异常、并发性能和安全性等方面的测试用例: 基础功能: 验证输入框是否能够接收用户输入,并显示输入的文字。检查输入框是否支持常见的字符输入,如字母、数字、标点符号…

Unity Shader 流光 边缘光

前言 Unity2021.3.23 一、实现原理 Time控制UV的变化,再采样一张流光贴图.即可实现流光效果。 二、效果及源码展示 1.流光效果 效果描述: 1.边缘光(菲尼尔), 2.从上到下扫描光. 效果图如下: 代码如下: Shader "Unlit/ScanCode" {Properties{_MainTe…

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…