前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构学习-python实现-树--0414

数据结构学习-python实现-树--0414

原创
作者头像
到不了的都叫做远方
修改于 2020-04-15 02:25:19
修改于 2020-04-15 02:25:19
52500
代码可运行
举报
运行总次数:0
代码可运行

树的实战应用:解析树。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import stack  # 之前写好的栈
import binarytree  # 之前写好的二叉树
import operator  # 处理运算符
 
def buildparsetree(fpexp):
    print(fpexp)  # 打印输入,避免出问题,例如不符合解析形式,这段代码必须是全括号。
    fplist = list(fpexp)
    pstack = stack.Stack()
    etree = binarytree.BinaryTree('')  #新建空树
    pstack.push(etree)  # 讲树的根节点压入栈
    currenttree = etree  # 确定当前节点位置
    for i in fplist:
        if i == '(':
            currenttree.insertleft('')  # 插入左子树
            pstack.push(currenttree)  # 将根节点压入栈
            currenttree = currenttree.getleftchild()  # 当前节点移动到左子节点
        elif i not in ['+', '-', '*', '/', ')']:
            currenttree.setrootvalue(int(i))
            parent = pstack.pop()
            currenttree = parent  # 为了此步骤才需要栈,当前节点退回根节点
        elif i in ['+', '-', '*', '/']:
            currenttree.setrootvalue(i)
            currenttree.insertright('')
            pstack.push(currenttree)
            currenttree = currenttree.getrightchild()
        elif i == ')':
            currenttree = pstack.pop()
        else:
            raise ValueError
    return etree


def evaluate(parsetree):
    opers = {'+': operator.add, '-': operator.sub,
             '*': operator.mul, '/': operator.truediv}
    leftc = parsetree.getleftchild()
    rightc = parsetree.getrightchild()

    if leftc and rightc:
        fn = opers[parsetree.getrootvalue()]
        return fn(evaluate(leftc), evaluate(rightc))
    else:
        return parsetree.getrootvalue()


c = buildparsetree("((3+2)*(4+5))")
print(evaluate(c))


def postordereval(tree):  # 后缀表达式的解析树
    opers = {'+': operator.add, '-': operator.sub,
             '*': operator.mul, '/': operator.truediv}
    res1 = None
    res2 = None
    if tree:
        res1 = postordereval(tree.getleftchild())
        res2 = postordereval(tree.getrightchild())
        if res1 and res2:
            return opers[tree.getrootvalue()](res1, res2)
        else:
            return tree.getrootvalue()

def printexp(tree):  # 从树改写为中缀表达式
    sval = ''
    if tree:
        sval = printexp(tree.getleftchild())
        sval = sval + str(tree.getrootvalue())
        sval = sval + printexp(tree.getrightchild())
        if len(sval) != 1:  # 取消单个数字上的括号
            sval = '(' + sval + ')'
    return sval

print(printexp(c))

二叉堆,将入队出队的复杂度保持在O(logn)

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class BinHeap:
    def __init__(self):
        self.heaplist = [0]  # 为了后续的下标可实现父节点是子节点的二分之一这一性质。
        self.currentsize = 0

    def percup(self, i):  # 数据上浮,若子节点的值小于父节点,则数据交换上浮
        while i // 2 > 0:
            if self.heaplist[i] < self.heaplist[i//2]:
                self.heaplist[i//2], self.heaplist[i] = self.heaplist[i], self.heaplist[i//2]
                i //= 2

    def insert(self, k):
        self.heaplist.append(k)
        self.currentsize += 1
        self.percup(self.currentsize)

    def percdown(self, i):  # 数据下沉,当删除最小值时,使用最后的值替换最小值,然后将其下沉至合适位置。
        while (i * 2) <= self.currentsize:
            mc = self.minchild(i)
            if self.heaplist[i] > self.heaplist[mc]:
                self.heaplist[i], self.heaplist[mc] = self.heaplist[mc], self.heaplist[i]
                i = mc

    def minchild(self, i):  # 取左右子节点当中较小的值
        if i * 2 + 1 > self.currentsize:
            return i * 2
        else:
            if self.heaplist[i*2] < self.heaplist[i*2+1]:
                return i * 2
            else:
                return i * 2 + 1

    def delmin(self):
        retval = self.heaplist[1]
        self.heaplist[1] = self.heaplist[self.currentsize]
        self.currentsize -= 1
        self.heaplist.pop()
        self.percdown(1)
        return retval

    def buildheap(self, alist):  # alist是key值的列表,根据其大小进行建堆
        i = len(alist) // 2
        self.currentsize = len(alist)
        self.heaplist = [0] + alist[:]
        print(len(self.heaplist), i)
        while i > 0:
            print(self.heaplist, i)
            self.percdown(i)
            i -= 1
        print(self.heaplist, i)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构学习-python实现-树--0413
树的特点: 1.分类体系是层次化的,越靠近根部,性质越普遍,越靠近叶子,性质越独特。 2.同一父节点下的不同子节点相互隔离且独立。 3.每个叶节点具有唯一性。 树的定义:由若干节点以及两两相连节点的边组成,具备以下性质: 1.其中一个节点被设置为根 2.每个节点n(除了根节点)都恰有一条来自父节点p的边。 3.每个节点从根节点开始的路径是唯一的。 若每个节点最多有两个子节点,称为二叉树。 # 用嵌套列表实现二叉树 def binarytree(r): # 生成空树 return [r, [], [
到不了的都叫做远方
2020/04/13
3710
Python带你了解数据结构【二】
上次我们介绍了线性的数据结构,数组,链表,栈,队列,这次我们来看看非线性的数据结构。
我被狗咬了
2020/07/06
4640
Python带你了解数据结构【二】
数据结构学习-python实现-优先队列--0417
class PriorityQueue: def __init__(self): self.heap_array = [(0, 0)] self.current_size = 0 def build_heap(self, alist): self.current_size = len(alist) self.heap_array = [(0, 0)] for x in alist: s
到不了的都叫做远方
2020/04/17
3080
python数据结构之二叉树
树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构;在计算机领域中也有广泛应用,如在编译程序中,可用树来表示源程序的语法结构;在数据库系统中,树型结构也是信息的重要组织形式之一;在机器学习中,决策树,随机森林,GBDT等是常见的树模型
python与大数据分析
2022/03/11
4350
python数据结构之二叉树
重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
树的分类有很多种,但基本都是 二叉树 的衍生,今天来学习下二叉树。 什么是二叉树 Binary Tree 先来个定义: 二叉树是有限个节点的集合,这个集合可以是空集,也可以是一个根节点和至多两个子二
张拭心 shixinzhang
2018/01/05
1.2K0
重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
数据结构学习-python实现-平衡二叉查找树--0416
AVL树,在Key插入时始终保持平衡的二叉查找树,并不是完全平衡,而是平衡因子在(-1,0,1)均称为平衡树。
到不了的都叫做远方
2020/04/16
7860
python小例子(一)
参考链接:https://zhuanlan.zhihu.com/p/83998758?utm_source=qq&utm_medium=social&utm_oi=728200852833075200
西西嘛呦
2020/08/26
3920
重温数据结构:二叉排序树的查找、插入、删除
根据给定的文章内容,撰写摘要总结。
张拭心 shixinzhang
2018/01/05
1.2K0
重温数据结构:二叉排序树的查找、插入、删除
数据结构学习-python实现-二叉搜索树--0415
二叉查找树的生成,以及增删查,删除最为复杂,考虑的情况特别多,左右子树,容易把人弄乱。最重要的是删除后,需要将其右子树的最小值补充过来,有一番替换的过程。
到不了的都叫做远方
2020/04/15
4810
数据结构09 哈夫曼树
这一篇要总结的是树中的哈夫曼树(Huffman Tree),我想从以下几点对其进行总结: 1、什么是哈夫曼树 2、如何构建哈夫曼树 3、哈夫曼编码 4、代码实现 1、什么是哈夫曼树 什么是哈夫曼树
nnngu
2018/03/15
7840
数据结构09 哈夫曼树
重学数据结构(六、树和二叉树)
树(Tree)是n(n>=0)个结点的有限集,它或为空树(n= 0);,或为非空树,对千非空树T:
三分恶
2020/10/30
8270
重学数据结构(六、树和二叉树)
【leetcode刷题】T155-叶子相似的树
请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
木又AI帮
2019/09/03
4390
【leetcode刷题】T155-叶子相似的树
用Python实现数据结构之树
这个抽象类中的方法必须在子类中实现才能调用,不然会产生NotImplementedError(‘must be implemented by subclass’)的异常
py3study
2020/01/17
1.1K0
数据结构—完全二叉树「建议收藏」
上篇博客介绍了一种非线性结构—普通树 的含义以及一些特性,本文将介绍二叉树、满二叉树以及完全二叉树的一些特性及实现。
全栈程序员站长
2022/09/07
3580
数据结构—完全二叉树「建议收藏」
Python数据分析常用30段优化代码
以下方法可以检查给定列表是不是存在重复元素,它会使用 set() 函数来移除所有重复元素。
天道Vax的时间宝藏
2022/05/11
3920
数据结构之树
树(Tree)是一种重要的数据结构,它在计算机科学中被广泛应用。树由节点(Node)组成,这些节点之间通过边(Edge)相连接。树的一个特殊节点被称为根(Root),除了根节点外,每个节点都有一个父节点(Parent)和零个或多个子节点(Child)。
人不走空
2024/02/20
1380
数据结构之树
30个Python常用极简代码,拿走就能用
本文是 30 个极简任务,初学者可以尝试着自己实现;本文同样也是 30 段代码,Python 开发者也可以看看是不是有没想到的用法。
龙哥
2021/03/11
6060
即学即用的 30 段 Python 实用代码
原标题 | 30 Helpful Python Snippets That You Can Learn in 30 Seconds or Less
1480
2019/12/05
7960
即学即用的 30 段 Python 实用代码
即学即用的30段Python实用代码
原标题 | 30 Helpful Python Snippets That You Can Learn in 30 Seconds or Less
AI研习社
2019/09/12
7850
数据结构+算法(第08篇):史上最猛之递归屠龙奥义
本系列的第6篇《再不会“降维打击”你就Out了!》讲述了递归算法的意义、套路,第7篇《神力加身!动态编程》讲述了递归算法的优化,但是在大量的实际项目、工程和大家关心的求职面试中,却会碰到大量消除递归的需求。于是产生了两个问题:
用户5224393
2019/06/05
6660
数据结构+算法(第08篇):史上最猛之递归屠龙奥义
相关推荐
数据结构学习-python实现-树--0413
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验