树的应用举例

这篇博客探讨了二叉树的概念,并通过文件系统结构的实际例子展示了其应用。二叉树作为一种重要的数据结构,对于理解和组织数据至关重要,特别是在实现如文件系统这样的层次结构中起到关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树

'''


'''


#先序遍历  【这里指根在先】
from collections import deque

class BitTree():
    def __init__(self):
        self.root=None
    def insert(self,node,pos):
        pass
    @staticmethod
    def pre_order(BitTreeNode):
        if BitTreeNode:
            print(BitTreeNode.data,end="")
            BitTree.pre_order(BitTreeNode.lchild)
            BitTree.pre_order(BitTreeNode.rchild)


    @staticmethod
    def in_order(BitTreeNode):#这个方法基于node
        if BitTreeNode:
            BitTree.pre_order(BitTreeNode.lchild)
            print(BitTreeNode.data, end="")

            BitTree.pre_order(BitTreeNode.rchild)

    @staticmethod
    def post_order(BitTreeNode):
            if BitTreeNode:
                BitTree.post_order(BitTreeNode.lchild)
                BitTree.post_order(BitTreeNode.rchild)
                print(BitTreeNode.data, end="")
    @staticmethod
    def layer_order(BitTreeNode):
        # 利用队列实现算法:先到第二层的时候,用掉
        queue=deque()
        queue.append(BitTreeNode)
        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)




class BitTreeNode():
    '''二叉树的node具有什么特点呢
    具有左子树,有子树,母节点'''
    def __init__(self,data=None):
        self.data=data
        self.parent=None
        self.lchild=None
        self.rchild=None
a=BitTreeNode("A")
b=BitTreeNode("B")
c=BitTreeNode("C")
d=BitTreeNode("D")
e=BitTreeNode("E")
f=BitTreeNode("F")
g=BitTreeNode("G")
tree1=BitTree()
tree1.root=e
e.lchild=a
a.rchild=c
c.lchild=b
c.rchild=d
e.rchild=g
g.rchild=f
tree1.pre_order(tree1.root)
print("前序遍历\n")
'''
1.显示A-C-B-D这棵树。再这颗树里,左侧没有,中间根是A,然后右侧CBD树,对于CBD树,BCD。所以左侧的顺序就是A-B-C-D,然后中间E。再到右侧,G-F树左侧没有节点,按照左中右,则是GF顺序
'''
tree1.in_order(tree1.root)
print("中\n")
tree1.post_order(tree1.root)
print("后\n")
tree1.layer_order(tree1.root)
print("层次\n")

文件系统结构

'''
实现文件系统【文件系统是种树结构】
'''
version="1.0"
details="不支持绝对路径,不支持搜索"
print("当前文件系统版本是{0} \n具体情况是{1}".format(version,details))

class FileSystemTree():
    def __init__(self):
        self.root=Node("/") #根目录是”/",模拟linuxxitong
        self.now=self.root #文件系统当前的位置
     # 模拟linux文件系统的命令
    def mkdir(self,name):
        # 创建文件夹,要求必须以斜杠结尾
        if name[-1] != "/":
            name+="/"
        node=Node(name)
        self.now.children.append(node)
        node.parent=self.now
    def ls(self):
        "显示当前目录下的内容"
        return self.now.children
    def cd(self,name):
        "change dir to expected position"
        if name[-1] != "/":
            name+="/"
        #支持cd到下一级
        for child in self.now.children:
            if child.name == name:
                self.now=child
                return

        #支持..返回上一级
        if name == "../" or "..":
            if self.now != None:
                self.now =self.now.parent
            return
        # 支持绝对路径

        raise ValueError("Invalid dir")
    def pwd(self):
        "获取当前位置"
        return self.now
    def find(self,name):
        pass
    def tree(self):
        "列出当前的结构"


class Node():
    def __init__(self,name):
        self.name=name
        self.type=type
        self.children=[] # 下一级可能有很多内容
        self.parent=None # 直接的上一级只有1个
    def __repr__(self):
        return (self.name)
        #当仅定义 __repr__ 的时候, __repr__ == __str__, 但是仅定义 __str__ 的情况下,两者不相等

# n=Node("HELLO")
# n2=Node("HELLO2")
# n.children.append(n2)
# n2.parent=n
# print(n)

tree=FileSystemTree()
tree.mkdir("var/")
print(tree.root.children)
print(tree.ls())
tree.mkdir("/usr")
tree.cd("/usr")
tree.mkdir("zeng/")
tree.mkdir("jie/")
tree.cd("zeng/")
tree.mkdir("mon1")
print(tree.pwd())
tree.cd("..")
print(tree.pwd())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值