Python数据结构(树)

 

 

模拟文件系统:

class Node:
    def __init__(self,name,type='dir'):
        self.name=name
        self.type=type
        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+='/'
        node=Node(name)
        self.now.children.append(node)
        node.parent=self.now
        
    def ls(self,name):
        return self.now.children
    
    def cd(self,name):
        if name[-1]!='/':
            name+='/'
        if name=='../':
            self.now=self.now.parent
            return 
        for child in self.now.children:
            if child.name==name:
                self.now=child
                return
        raise ValueError('invalid dir')
    

二叉树:

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

 

遍历:

import collections

from collections import deque

class BiTreeNode:
    def __init__(self,data):
        self.data=data
        self.lchild=None    #左孩子
        self.rchild=None    #右孩子
        
def pre_order(root):    #前序遍历
    if root:
        print(root.data,end=',')
        pre_order(root.lchild)
        pre_order(root.rchile)
        
def in_order(root):    #中序遍历
    if root:
        pre_order(root.lchild)
        print(root.data, end=',')
        pre_order(root.rchile)
        
def past_order(root):    #后续遍历
    if root:
        pre_order(root.lchild)
        pre_order(root.rchile)
        print(root.data, end=',')
        
def level_order(root):    #层次遍历
    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)
            
    

 

 

 

 

插入、查询、删除

from collections import deque

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

class BST:
    def __init__(self,li=None):
        self.root=None
        if li:
            for val in li:
                self.insert_no_rec(val)

    #递归版本 插入
    def insert(self,node,val):
        if not node:
            node=BiTreeNode(val)
        elif val<node.data:
            node.lchild=self.insert(node.lchild,val)
            node.lchild.parent=node
        elif val>node.data:
            node.rchild=self.insert(node.rchild,val)
            node.rchild.parent=node
        return node

    #非递归版本 插入
    def insert_no_rec(self,val):
        p=self.root
        if not p:
            self.root=BiTreeNode(val)
            return
        while True:
            if val<p.data:
                if p.lchild:
                    p=p.lchild
                else:
                    p.lchild=BiTreeNode(val)
                    p.lchild.parent=p
                    return
            elif val>p.data:
                if p.rchild:
                    p=p.lrchild
                else:
                    p.lrchild=BiTreeNode(val)
                    p.lrchild.parent=p
                    return
            else:
                return

    #递归版本 查询
    def query(self,node,val):
        if not node:
            return None
        if node.data<val:
            return self.query(node.rchild,val)
        elif node.data>val:
            return self.query(node.lchild,val)
        else:
            return node

    #非递归版本 查询
    def query_no_rec(self,val):
        p=self.root
        while p:
            if p.data<val:
                p=p.rchild
            elif p.data>val:
                p=p.lchild
            else:
                return p
        return None

    def pre_order(self,root):  # 前序遍历
        if root:
            print(root.data, end=',')
            self.pre_order(root.lchild)
            self.pre_order(root.rchile)

    def in_order(self,root):  # 中序遍历
        if root:
            self.pre_order(root.lchild)
            print(root.data, end=',')
            self.pre_order(root.rchile)

    def past_order(self,root):  # 后续遍历
        if root:
            self.pre_order(root.lchild)
            self.pre_order(root.rchile)
            print(root.data, end=',')

    def level_order(self,root):  # 层次遍历
        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)

    def __remove_node_1(self,node):
        if not node.parent: #node是叶子节点
            self.root=None
        if node==node.parent.lchild:    #node是他父亲的左孩子
            node.parent.lchild=None
        else:   #右孩子
            node.parent.rchild=None

    def __remove_node_2_1(self,node):
        # node只有一个左孩子
        if not node.parent: #根节点
            self.root=node.lchild
            node.lchild.parent=None
        elif node==node.parent.lchild:
            node.parent.lchild=node.lchild
            node.lchild.parent=node.parent
        else:
            node.parent.rchild = node.lchild
            node.rchild.parent = node.parent

    def __remove_node_2_2(self,node):
        # node只有一个右孩子
        if not node.parent: #根节点
            self.root=node.rchild
        elif node==node.parent.lchild:
            node.parent.lchild=node.rchild
            node.rchild.parent=node.parent
        else:
            node.parent.rchild = node.rchild
            node.rchild.parent = node.parent

    def delete(self,val):
        if self.root:   #不是空树
            node=self.query_no_rec(val)
            if not node:    #不存在
                return False
            if not node.lchild and not node.rchild: #叶子节点
                self.__remove_node_1(node)
            elif not node.rchild:   #只有一个左孩子
                self.__remove_node_2_1(node)
            elif not node.lchild:   #只有一个右孩子
                self.__remove_node_2_2(node)
            else:   #两个孩子都有
                min_node=node.rchild
                while min_node.lchild:
                    min_node=min_node.lchild
                node.data=min_node.data
                #删除min_node
                if min_node.rchild:
                    self.__remove_node_2_2(min_node)
                else:
                    self.__remove_node_1(min_node)
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_te_amo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值