1. 树的概念

  树是一种非线性的数据结构,由n(n>=0)个有限节点组成,n=0是称为空数。

  树的特点:

   1. 数有一个根节点,根节点没有前驱节点

   2. 除根节点外的其他节点有可以组成互不相交的集合,每个集合有是一棵树

   3. 子树根节点只有一个前驱节点,可以有0个或多个后驱节点

   4. 树是一种可以递归定义的数据结构

 

  一颗普通的树:

   

 

 

   树的相关概念:

    1. 节点的度:一个节点含有的子树的个数:如A节点的度为6,B节点的度为0,D节点的度为1

    2. 根节点和叶子节点:度为零的节点:如根节点为A,叶子节点为B、C、H、I、P、Q、K、L、M、N

    3. 父节点和子节点:父节点即前驱节点,子节点即后驱节点:如J的父节点是E,J的子节点是P和Q

    4. 兄弟节点:拥有相同父节点的节点:如P和Q是兄弟节点

    5. 树的度:一棵树中最大节点的度称为树的度:如上图的树的度为6

    6. 树的深度或高度:一棵树的最大层次:如上图的数的深度为4

 

 

2. 树的实现:模拟linux文件系统

# 构建节点类
class Node:
    def __init__(self, name):
        self.name = name
        self.children = []      # 子文件或目录
        self.parent = None      # 父目录
    
    # 字符串显示转换
    def __repr__(self):
        return self.name

# 文件系统类
class FileSystemTree:
    def __init__(self):
        self.root = Node('/')       # 初始 / 为根目录
        self.now = self.root        # 定义当前所在位置

    # 创建目录
    def mkdir(self, name):
        # 给目录加上/结尾作为标志
        if name[-1] != '/':
            name += '/'
        # 判断创建的目录是否存在
        for i in self.now.children:
            if i.name == name:
                print("目录已存在,无法创建!")
                return
        node = Node(name)       # 生成节点
        self.now.children.append(node)      # 将当前位置的子目录插入节点
        node.parent = self.now              # 设置节点的父级目录

    # 创建文件
    def touch(self, name):
        # 遍历文件,判断文件是否存在
        for child in self.now.children:
            if child.name == name:
                name += "-副本"
        # 和创建目录一致
        node = Node(name)
        self.now.children.append(node)
        node.parent = self.now

    # 显示当前目录下的所有文件
    def ls(self):
        return self.now.children    # 返回当前位置的子文件

    # 切换目录
    def cd(self, name):
        # 给文件不起标志符
        if name[-1] != '/':
            name += '/'
        # 返回上一层目录
        if name == "../":
            self.now = self.now.parent
            return
        # 返回根目录
        if name == "/":
            self.now = self.root
            return
        # 遍历当前目录的子文件
        for child in self.now.children:
            if child.name == name:
                self.now = child
                return
        raise ValueError("not this dir!")

    # 删除文件和目录
    def rm(self, name):
        # 判断是否存在当前删除的文件或目录
        for child in self.now.children:
            if child.name == name:
                # 移除需要删除的文件的下标
                self.now.children.pop(self.now.children.index(child))
                return
        raise ValueError("不存在此文件或目录")

tree = FileSystemTree()

 

posted @ 2023-01-10 17:23  无敌小豆包  阅读(97)  评论(0)    收藏  举报