【数据结构4】树的实例-模拟文件系统、二叉树的遍历(先序遍历、中序遍历、后序遍历、层次遍历)

news2024/11/13 9:39:57

1 树和二叉树
2 树的实例-模拟文件系统
3 二叉树
3.1 二叉树的遍历
二叉树的先序遍历
二叉树的中序遍历
二叉树的后序遍历
二叉树的层次遍历

1 树

树是一种数据结构
比如:目录结构
树是一种可以递归定义的数据结构

树是由n个节点组成的集合:
	如果n=0,那这是一棵空树;
	如果n>0,那存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一棵树

在这里插入图片描述

2 树的实例-模拟文件系统

class Node:
    """
    表示文件系统树中的一个节点。

    属性:
        name (str): 节点的名称。对于目录,它以 '/' 结尾,对于文件,不以 '/' 结尾。
        type (str): 节点的类型,'dir' 代表目录,'file' 代表文件。
        children (list): 该节点的子节点列表。仅对目录节点有效。
        parent (Node): 该节点的父节点。如果是根节点,则为 None。
    """

    def __init__(self, name, type='dir'):
        """
        初始化一个新的节点。

        :param name: 节点的名称。目录名称通常以 '/' 结尾,文件名称不以 '/' 结尾。
        :param type: 节点的类型。默认为 'dir'(目录),可以设置为 'file'(文件)以表示文件节点。
        """
        self.name = name
        self.type = type
        self.children = []  # 初始化为空列表,目录节点可以包含子节点
        self.parent = None  # 父节点初始化为 None

    def __repr__(self):
        return self.name


class FileSystemTree:
    """
    表示一个文件系统树,支持创建目录、列出目录内容以及切换目录等操作。

    属性:
        root (Node): 文件系统树的根节点,初始化时创建。
        now (Node): 当前工作目录。操作会影响该目录。
    """

    def __init__(self):
        """
        初始化文件系统树,创建根目录,并将当前工作目录设置为根目录。
        """
        self.root = Node("/")  # 创建根目录,名称为 "/"
        self.now = self.root  # 将当前工作目录设置为根目录

    def mkdir(self, name):
        """
        在当前工作目录下创建一个新的目录。

        :param name: 新目录的名称。必须以 '/' 结尾。如果没有结尾的 '/', 会自动添加。
        """
        if name[-1] != "/":  # 检查目录名称是否以 '/' 结尾
            name += '/'  # 添加 '/' 以确保目录名称正确
        node = Node(name)  # 创建新的目录节点
        self.now.children.append(node)  # 将新目录添加到当前工作目录的子节点列表中
        node.parent = self.now  # 设置新目录的父节点为当前工作目录

    def ls(self):
        """
        展示当前工作目录下的所有子节点。

        :return: 当前目录下的子节点列表(包括目录和文件)。
        """
        return self.now.children  # 返回当前目录的子节点列表

    def cd(self, name):
        """
        切换到指定的目录。支持绝对路径和相对路径。

        :param name: 目标目录的路径。可以是绝对路径(以 '/' 开头)或相对路径(不以 '/' 开头)。
        :return: 无返回值。成功切换目录时,更新当前工作目录。
        :raises ValueError: 如果指定的路径无效或目录不存在,抛出异常。
        """
        if name[-1] != "/":  # 确保目录名称以 '/' 结尾
            name += '/'

        # 处理路径
        components = name.split('/')  # 将路径分解为各个部分
        node = self.now  # 从当前工作目录开始遍历

        for component in components:
            if component == '..':
                # 如果路径部分是 '..',则返回到上一级目录
                if node.parent is not None:
                    node = node.parent
            elif component and component != '/':
                # 如果路径部分是有效的目录名,则查找该目录
                found = False
                for child in node.children:
                    if child.name == component + '/':
                        node = child  # 找到目标目录,更新当前节点
                        found = True
                        break
                if not found:
                    # 如果没有找到目标目录,则抛出异常
                    raise ValueError('无效的目录')

        self.now = node  # 更新当前工作目录为目标目录


tree = FileSystemTree()
tree.mkdir('var/')
tree.mkdir('bin/')
tree.mkdir('bin/python')
tree.mkdir('usr/')

print(tree.root.children)
print(tree.ls())
print(tree.cd('bin/'))
tree.cd("../")
print(tree.ls())

3 二叉树

二叉树的链式存储:将二叉树的节点定义为一个对象,节点之间通过类似链表的链接方式来连接。

节点定义:
class BiTreeNode:
	def __init__(self, data):
		self.data = data
		self.lchild = None
		self.rchild = None

**实现这棵二叉树**
在这里插入图片描述

class BiTreeNode:
    def __init__(self, data):
        self.data = data
        self.lchild = None  # 左孩子
        self.rchild = None  # 右孩子


a = BiTreeNode('A')
b = BiTreeNode('B')
c = BiTreeNode('C')
d = BiTreeNode('D')
e = BiTreeNode('E')
f = BiTreeNode('F')
g = BiTreeNode('G')

e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = f

root = e
print(root.lchild.rchild.data)

3.1 二叉树的遍历

在这里插入图片描述

二叉树的前序遍历

def pre_order(root):
    """
    二叉树的前序遍历
    :param root:
    :return:
    """
    if root:
        print(root.data, end=',')
        pre_order(root.lchild)
        pre_order(root.rchild)

pre_order(root)  # E,A,C,B,D,G,F,

二叉树的中序遍历

def mid_order(root):
    """
    二叉树的中序遍历
    :param root:
    :return:
    """
    if root:
        mid_order(root.lchild)
        print(root.data, end=',')
        mid_order(root.rchild)
        
        
mid_order(root)  # A,B,C,D,E,G,F,

二叉树的后序遍历

def post_order(root):
    """
    二叉树的后序遍历
    :param root:
    :return:
    """
    if root:
        post_order(root.lchild)
        post_order(root.rchild)
        print(root.data, end=',')


post_order(root)  # A,C,B,D,G,F,E

二叉树的层次遍历

from collections import deque


def level_order(root):
    """
    层次遍历二叉树的函数
    :param root: 二叉树的根节点
    :return: None
    """
    # 初始化一个队列,用于层次遍历
    queue = deque()

    # 将根节点入队
    queue.append(root)

    # 当队列不为空时,继续遍历
    while len(queue) > 0:
        # 从队列中取出一个节点
        node = queue.popleft()

        # 打印当前节点的数据
        print(node.data, end=',')

        # 如果当前节点有左子节点,将左子节点入队
        if node.lchild:
            queue.append(node.lchild)

        # 如果当前节点有右子节点,将右子节点入队
        if node.rchild:
            queue.append(node.rchild)


level_order(root)  # E,A,G,C,F,B,D,

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

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

相关文章

测试用例(还需要输入1个字)

近期机缘巧合,连续写2个项目的测试用例。第一个项目,纯属没有办法,参与该项目的现在就只剩我一个人了,只能自己写了,这不,我专门跑到客户那啥都不干,写文档写了2天;第二个项目&#…

如何使用gewe开发微信机器人

本文介绍了如何利用GeWe框架开发一个功能丰富的微信智能机器人。GeWe是一个开发协议,为微信机器人提供了强大的功能支持,包括关键字回复、自动通过好友和自动发朋友圈等特性。我们将通过一个简单的示例演示如何在GeWe框架下实现这些功能,并附…

模型 空雨伞

列文章 分享 模型,了解更多👉 模型_思维模型目录。观察现状,分析原因,制定行动。 1 空雨伞模型的应用 1.1 空雨伞模型应用之API对接的决策 某公司产品经理A君接到了与合作方对接API的任务。合作方对公司的中台API有特定的需求&…

有什么办法能恢复郎科u盘的数据?常用方法分享

在数字化时代,数据已成为我们生活与工作中不可或缺的一部分。郎科U盘,以其便携、稳定的特性,成为了许多人存储重要文件的首选。然而,面对突如其来的数据丢失,无论是误删、格式化还是病毒侵袭等,都足以让人心…

【Qt】常见控件 —— QWidget(上)

文章目录 QWidget 的基本介绍QWidget 的 enable 属性QWidget 的 geometry属性QWidget 的 windowTitle属性 QWidget 的基本介绍 Qt 中 的 各种控件 都继承自 QWidget类 在 Qt designer 右侧 就显示出 QWidget的各种属性 并且也可以直接进行编辑 QWidget 的 enable 属性 enable…

ETAS工具链自动化实战指南<二>

----自动化不仅是一种技术,更是一种思维方式,它将帮助我们在快节奏的工作环境中保持领先! 目录 往期推荐 RTA-A2L工具概览 RTA-A2L的输出文件 常用命令行参数 场景1:通过 MCSD 文件来生成 .a2l 文件并更新地址 命令用法 命…

getchar(),putchar(),EOF的详细解释

文章目录 getchar(),putchar(),EOF的意义和作用一、相关函数putchar( )getchar() 二、EOF 的值三、总结 getchar(),putchar(),EOF的意义和作用 在 C 语言中,EOF 是 End Of File 的缩写,即文件结束标志。 在读取文件时&#xff0…

趣味算法------饮料换购

目录 题目描述: 解题思路: 具体代码: C语言版本: python版本: 题目描述: 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以…

SCI论文系统各阶段状态含义,一文带你全面掌握!告别投稿小白!

知识小站 SCI(Science Citation Index,科学引文索引)是由美国科学信息研究所(Institute for Scientific Information, ISI)创建的一个引文数据库。它收录了全球各学科领域中最具影响力的学术期刊,涵盖自然…

尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块

尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块 前言一、资源来源二、实践步骤1.修改OH内核并编译2.动态库增加welog打印3.设备验证打完收工 总结参考 前言 最近在搞OpenHarmony4.0蓝牙模块的适配,最主要的工作就是在libbt_vendor.z.so这个库的编写修改&am…

文件找回用哪个数据恢复软件好?最佳文件恢复软件值得拥有!

在如今数字化的时代,文件已经成为我们工作和生活中不可或缺的重要组成部分。然而,由于各种意外情况,如误删除、系统故障、病毒攻击或存储设备损坏等,文件丢失的情况时有发生。当这种情况发生时,一款出色的数据恢复软件…

解锁SQL的无限可能 | 且看如何秒解墨天轮SQL挑战赛第二期题目

目 录 墨天轮SQL挑战赛第二期 比赛题目 数据准备 解题过程 方法1: 优雅的解法 | last_value分析函数忽略NULL值特性实现 方法2: 通用的解法 | 断点分组思想 小结 Sql进阶技巧: 如何分析商品入库采购成本数据缺失问题?| 近距离有效的数据缺失值…

jvm 调优篇

一 jvm调优篇 1.1 查看新生代和老年代的比例 输入命令: jinfo -flag NewRatio 17480 1.2 查看新生代,survivor和Eden区比例 1.3 查看jvm调优参数 二 调优参数 2.1 oom异常 通过visual vm查看 2.java dump 大对象 2.2 mat工具进行分析 栈的信息

生物信息学数据分析服务

常见个性化分析列表 GEO相关服务 1,芯片数据挖掘。根据芯片类型,计算表达谱,差异基因等 2,高通量测序数据挖掘。根据测序类型,计算表达谱,差异或者peak calling等 3,多组学数据联合分析 4&…

2024年测试岗最新自动化测试面试题整理,干货满满

前言 本文由作者本人根据2024年测试岗最新面试整理所得!内容是很干货的!对我也很有帮助。本文仅做个分享~ 一、接口测试 1、接口测试用例的编写要点有哪些?(问法二:接口测试用例设计需要考虑哪些方面?问法…

AList嵌入动态验证码实现动态校验

前言 晓杰利用ALists创建了个网盘资源站,想着如何增加个动态验证码进行验证后才能进行访问下载,刚开始利用了固定的验证码,用户可以通过JS代码中进行绕过或直接拿到验证码,经过晓杰多次优化,最终版本支持动态获取验证…

大模型之LangChain介绍

1、LangChain介绍 LangChain 就是一个 LLM 编程框架,你想开发一个基于 LLM 应用,需要什么组件它都有,直接使用就行;甚至针对常规的应用流程,它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。下面我们…

使用ftl文件导出时,多层嵌套循环

核心点 //针对集合1进行循环 <#list priceDetail as pd>//对集合1中包含的集合2进行存在和判空 判断<#if pd.detail ?exists && pd.detail ?size!0> //对集合2进行循环<#list pd.detail as d>...</#list></#if></#list> 模版…

kafka发送消息-自定义消息发送的拦截器

1、自定义拦截器 创建自定义拦截器类&#xff0c;实现ProducerInterceptor接口。对消息进行拦截&#xff0c;可以在拦截中对消息做些处理&#xff0c;记录日志等操作… package com.power.config;import org.apache.kafka.clients.producer.ProducerInterceptor; import org…

会话技术:Cookie、Session、JWT的优缺点分析与实践

登录认证 会话技术方案一&#xff1a;Cookie方案二&#xff1a;Session方案三&#xff1a;令牌技术JWT令牌介绍生成和校验登录下发令牌案例 会话技术 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&…