二叉排序树的可视化实现
- 格式:pdf
- 大小:551.93 KB
- 文档页数:6
题目:二叉排序树的实现1 内容和要求1)编程实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩3 项),比照查找效率,并说明在什么情况下二叉排序树效率高,为什么?2 解决方案和关键代码2.1 解决方案:先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。
前中后根遍历需要用到栈的数据构造,分模块编写栈与遍历代码。
要求比照二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock〔〕函数记录查找时间来比照查找效率。
2.2关键代码树的根本构造定义及根本函数typedef struct{KeyType key;} ElemType;typedef struct BiTNode//定义链表{ElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree, *SElemType;//销毁树int DestroyBiTree(BiTree &T){if (T != NULL)free(T);return 0;}//清空树int ClearBiTree(BiTree &T){if (T != NULL){T->lchild = NULL;T->rchild = NULL;T = NULL;}return 0;}//查找关键字,指针p返回int SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p) {if (!T){p = f;return FALSE;}else if EQ(key, T->data.key){p = T;return TRUE;}else if LT(key, T->data.key)return SearchBST(T->lchild, key, T, p);elsereturn SearchBST(T->rchild, key, T, p);}二叉树的生成、插入,删除生成void CreateBST(BiTree &BT, BiTree p){int i;ElemType k;printf("请输入元素值以创立排序二叉树:\n");scanf_s("%d", &k.key);for (i = 0; k.key != NULL; i++){//判断是否重复if (!SearchBST(BT, k.key, NULL, p)){InsertBST(BT, k);scanf_s("%d", &k.key);}else{printf("输入数据重复!\n");return;}}}插入int InsertBST(BiTree &T, ElemType e){BiTree s, p;if (!SearchBST(T, e.key, NULL, p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = e;s->lchild = s->rchild = NULL;if (!p)T = s;else if LT(e.key, p->data.key)p->lchild = s;elsep->rchild = s;return TRUE;}else return FALSE;}删除//某个节点元素的删除int DeleteEle(BiTree &p){BiTree q, s;if (!p->rchild) //右子树为空{q = p;p = p->lchild;free(q);}else if (!p->lchild) //左子树为空{q = p;p = p->rchild;free(q);}else{q = p;s = p->lchild;while (s->rchild){q = s;s = s->rchild;}p->data = s->data;if (q != p)q->rchild = s->lchild;elseq->lchild = s->lchild;delete s;}return TRUE;}//整棵树的删除int DeleteBST(BiTree &T, KeyType key) //实现二叉排序树的删除操作{if (!T){return FALSE;}else{if (EQ(key, T->data.key)) //是否相等return DeleteEle(T);else if (LT(key, T->data.key)) //是否小于return DeleteBST(T->lchild, key);elsereturn DeleteBST(T->rchild, key);}return 0;}二叉树的前中后根遍历栈的定义typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int InitStack(SqStack &S) //构造空栈{S.base = (SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}//InitStackint Push(SqStack &S, SElemType e) //插入元素e为新栈顶{if (S.top - S.base >= S.stacksize){S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}//Pushint Pop(SqStack &S, SElemType &e) //删除栈顶,应用e返回其值{if (S.top == S.base) return ERROR;e = *--S.top;return OK;}//Popint StackEmpty(SqStack S) //判断是否为空栈{if (S.base == S.top) return TRUE;return FALSE;}先根遍历int PreOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);if (!Visit(p->data)) return ERROR;p = p->lchild;}else{Pop(S, p);p = p->rchild;}}return OK;}中根遍历int InOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);p = p->lchild;}else{Pop(S, p);if (!Visit(p->data)) return ERROR;p = p->rchild;}}return OK;}后根遍历int PostOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S, SS;BiTree p;InitStack(S);InitStack(SS);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);Push(SS, p);p = p->rchild;}else{if (!StackEmpty(S)){Pop(S, p);p = p->lchild;}}}while (!StackEmpty(SS)){Pop(SS, p);if (!Visit(p->data)) return ERROR;}return OK;}利用数组存储一个班学生信息ElemType a[] = { 51, "陈继真", 88,82, "黄景元", 89,53, "贾成", 88,44, "呼颜", 90,25, "鲁修德", 88,56, "须成", 88,47, "孙祥", 87, 38, "柏有患", 89, 9, " 革高", 89, 10, "考鬲", 87, 31, "李燧", 86, 12, "夏祥", 89, 53, "余惠", 84, 4, "鲁芝", 90, 75, "黄丙庆", 88, 16, "李应", 89, 87, "杨志", 86, 18, "李逵", 89, 9, "阮小五", 85, 20, "史进", 88, 21, "秦明", 88, 82, "杨雄", 89, 23, "刘唐", 85, 64, "武松", 88, 25, "李俊", 88, 86, "卢俊义", 88, 27, "华荣", 87, 28, "杨胜", 88, 29, "林冲", 89, 70, "李跃", 85, 31, "蓝虎", 90, 32, "宋禄", 84, 73, "鲁智深", 89, 34, "关斌", 90, 55, "龚成", 87, 36, "黄乌", 87, 57, "孔道灵", 87, 38, "张焕", 84, 59, "李信", 88, 30, "徐山", 83, 41, "秦祥", 85, 42, "葛公", 85, 23, "武衍公", 87, 94, "范斌", 83, 45, "黄乌", 60, 67, "叶景昌", 99, 7, "焦龙", 89, 78, "星姚烨", 85, 49, "孙吉", 90, 60, "陈梦庚", 95,};数组查询函数void ArraySearch(ElemType a[], int key, int length){int i;for (i = 0; i <= length; i++){if (key == a[i].key){cout << "学号:" << a[i].key << " 姓名:" << a[i].name << " 成绩:" << a[i].grade << endl;break;}}}二叉树查询函数上文二叉树根本函数中的SearchBST()即为二叉树查询函数。
算法可视化演示软件开发毕业设计目录前言 (1)第一章绪论 (2)第一节课题背景 (2)第二节课题的目的与意义 (2)第三节论文结构 (3)第二章相关知识概述 (4)第一节 Java知识相关概述 (4)一、Java的发展史 (4)二、Java的主要特性 (4)三、JDK 平台相关信息 (5)第二节 Java图形界面技术概述 (5)一、 Java Swing相关概述 (5)二、容器和布局 (7)三、事件处理 (8)第三节相关算法的介绍 (9)一、冒泡排序 (9)二、插入排序 (10)三、选择排序 (12)四、二叉查找树 (12)第四节本章小结 (15)第三章需求分析 (17)第一节系统功能需求 (17)一、系统设计目标 (17)二、系统功能需求 (17)第二节系统运行环境 (18)第三节本章小结 (18)第四章系统设计 (19)第一节系统总体描述 (19)第二节模块设计 (20)一、算法模块设计 (20)二、界面模块设计 (22)第三节系统流程图 (25)第四节本章小结 (26)第五章系统实现 (27)第一节可视化主界面的实现 (27)第二节排序算法界面所实现的功能 (28)第三节二叉查找树可视化功能的实现 (31)第四节本章小结 (33)第六章系统测试 (34)第一节问题解决及测试结果 (34)一、遇到的问题 (34)二、解决的方法 (34)三、测试结果 (34)第二节本章小结 (41)结论 (42)致谢 (43)参考文献 (44)附录 (45)一、英文原文 (45)二、英文翻译 (52)前言可视化( Visualizations)计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理的理论、方法和技术。
此次设计算法可视化( Algorithm Visualizations)就是利用可视化技术将算法可视化[1]。
排序是计算机程序设计中的一种重要操作,其功能是一个数据元素(或者记录)的任意序列,从新排列成一个按关键字有序的序列。
6.4 线索化二叉树从前面的讨论可知,遍历二叉树就是将非线性结构的二叉树线性化,即按一定规则将二叉树中的结点排列成一个线性序列依次访问。
如图6.20(a)所示的二叉树,经中序遍历得到线性序列:BADEC,经前序遍历得到线性序列:ABCDE,经后序遍历得到线性序列:BEDCA。
在这些线性序列中,二叉树中的每个结点(除第一个和最后一个外)有且仅有唯一的一个前趋和唯一的一个后继,很容易找到各个结点的直接前驱和直接后继。
但当以二叉链表作为二叉树的存储结构时,只能找到结点的左、右孩子,而不能直接找到前驱和后继,只有在遍历的动态过程中得到这些信息。
如果将这些信息在第一次遍历时保存起来,在需要再次对二叉树进行“遍历”时就可以将二叉树视为线性结构进行访问,从而简化遍历操作。
那么,如何存储遍历中得到的结点前驱和后继的信息呢?一个简单的办法是在每个结点上增加两个指针域fwd和bkwd,分别指向存储遍历中得到的结点前驱和后继。
fwd L child data R child bkwd这是采用多重链表来表示二叉树。
这种方法虽简单易行,但这种结构的存储密度将大大降低,浪费存储空间。
另一种方法,是利用原有链域L child 和R child的空链域。
在n个结点的二叉链表中有2n个孩子链域,其中仅有n-1个链域是用来指示结点的左右孩子,而另外n+1个链域是空链域。
现在把这些空链域利用起来,使其指向结点的前驱或后继;对那些原来就不为空的链域,则仍然指向左或右孩子。
如果把指向前驱和后继的指针称为线索(Thread),那么,如何区分指向左、右孩子的指针和指向前驱、后继的线索呢?在原结点结构上增加标志域定义为:0 Lchild为左指针,指向左孩子0 Rchild为右指针,指向右孩子ltag=rtag=1 Lchild为左线索,指向前驱 1 Rchild为右线索,指向后继以这种结点构成的二叉链表作为二叉树的存储结构,叫做线索链表,其C语言类型说明如下:Typedef struct ThreadTNode{enum{0,1} ltag, rtag;Elem Type data;Struct ThreadTNode *Lchild, *Rchild;}ThreadTNode, *ThreadTree;为了节省内存空间,我们用C语言的位段方法将结点中的左标志域和右标志域与数据域合并在一个存储单元中(即各用一位表示左标志和右标志,其余各位表示结点值)。
二叉排序树的实验报告二叉排序树的实验报告引言:二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数据按照一定的规则组织起来,便于快速的查找、插入和删除操作。
本次实验旨在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。
一、实验背景二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。
这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。
二、实验目的1. 理解二叉排序树的基本原理和性质;2. 掌握二叉排序树的构建、插入和删除操作;3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。
三、实验过程1. 构建二叉排序树首先,我们需要构建一个空的二叉排序树。
在构建过程中,我们可以选择一个节点作为根节点,并将其他节点插入到树中。
插入节点时,根据节点的值与当前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
重复这个过程,直到所有节点都被插入到树中。
2. 插入节点在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。
首先,从根节点开始,将新节点的值与当前节点的值进行比较。
如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
如果新节点的值与当前节点的值相等,则不进行插入操作。
3. 删除节点在二叉排序树中删除节点时,我们需要考虑不同的情况。
如果要删除的节点是叶子节点,即没有左右子树,我们可以直接删除该节点。
如果要删除的节点只有一个子树,我们可以将子树连接到要删除节点的父节点上。
如果要删除的节点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点替代该节点,并删除相应的替代节点。
四、实验结果通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果:1. 二叉排序树可以高效地进行查找操作。
实现二叉链表存储结构下二叉树的先序遍历的非递归算法要实现二叉链表存储结构下二叉树的先序遍历的非递归算法,可以使用栈来辅助存储节点。
首先,创建一个空栈,并将树的根节点压入栈中。
然后,循环执行以下步骤,直到栈为空:1. 弹出栈顶的节点,并访问该节点。
2. 若该节点存在右子节点,则将右子节点压入栈中。
3. 若该节点存在左子节点,则将左子节点压入栈中。
注:先将右子节点压入栈中,再将左子节点压入栈中的原因是,出栈操作时会先访问左子节点。
下面是使用Python语言实现的例子:```pythonclass TreeNode:def __init__(self, value):self.val = valueself.left = Noneself.right = Nonedef preorderTraversal(root):if root is None:return []stack = []result = []node = rootwhile stack or node:while node:result.append(node.val)stack.append(node)node = node.leftnode = stack.pop()node = node.rightreturn result```这里的树节点类为`TreeNode`,其中包含节点的值属性`val`,以及左子节点和右子节点属性`left`和`right`。
`preorderTraversal`函数为非递归的先序遍历实现,输入参数为二叉树的根节点。
函数中使用了一个栈`stack`来存储节点,以及一个列表`result`来存储遍历结果。
在函数中,先判断根节点是否为None。
如果是,则直接返回空列表。
然后,创建一个空栈和结果列表。
接下来,用一个`while`循环来执行上述的遍历过程。
循环的条件是栈`stack`不为空或者当前节点`node`不为None。
精品文档你我共享用动态规划来解决数字三角形问题软件34刘柏呈问题由来题目的出处是《可视化计算》课本讲贪心的一道例题(Page108,例3-4),选题的原因:一,老师要求用到动态规划的思想方法。
二,raptor是个可视化的编程软件,突出可视化,就必须有图形,而数字三角形本身就是个“二叉树”综上解题思路先构图的顶点,随即生成边,构成树,各个顶点中的数字随机生成,这样就完成输入问题。
再用动态规划寻找最大的路径,最后再运用可视化的特点,把选择的过程呈现给看程序的人。
1.首先是构图,出于美观性的考虑,我将数字三角形的可行层数控制为1-6层。
由于raptor没有编辑数组,所以我用两种方式为顶点编号:1,(i,j)来表示第i行第j个数。
2,用m表示,从上到下,从左到右的第m个点。
之后就是,计算点的坐标,找出坐标的规律,并适当的纪录。
2.动态规划,主要根据,状态转移方程:f[i,j]=max{f[i-1,j],f[i-1,j-1]}+c[i,j]其中,f[i,j]表示到(i,j)点的最大累加和,c[i,j]表示第(i,j)点的值。
3.显示用到递归的解法,根据之前纪录的“父节点”来搜索路径。
算法实现第一个子图composition就是构图,用来画二叉树,i控制行数,j控制列数,二重循环来画圆和线。
注意点:一,圆的大小应该适应画布和层数,所以我令k=画布高/层数,而用k/4作为半径画圆。
二,“线不能将圆戳破”即线的出发点不能是圆心,这里,我将上层圆的圆心与它的两个子圆的圆心连线的夹角令为60度,再根据圆中直角三角形的关系,算出对应圆周上的点,作为出发点。
三,弄清一个循环中该做什么,结论是:画一个圆和两条线,这里要注意判断一下是否是最后一层,最后一层不需要画线。
dp子图是用来完成动态规划算法的,这个算法只要知道状态转移方程就比较好实现,需要注意的是边界的控制,所以需要附初值。
还有就是,我每做一步用root数组纪录一下该点的“父亲”,以便之后查找。
二叉排序树怎么构造例题二叉排序树(Binary Search Tree,BST)是一种特殊的二叉树,它满足以下性质,对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。
构造二叉排序树的过程可以通过例题来说明。
假设我们有以下一组数字,8, 3, 10, 1, 6, 14, 4, 7, 13。
我们将按照顺序将它们插入到二叉排序树中。
首先,我们将第一个数字 8 作为根节点插入到树中。
接下来,我们将 3 插入到根节点的左子树中,因为 3 小于 8。
然后,我们将 10 插入到根节点的右子树中,因为 10 大于 8。
接着,我们将 1 插入到根节点的左子树的左子树中,因为 1小于 3。
然后,我们将 6 插入到根节点的左子树的右子树中,因为 6大于 3 且小于 8。
继续,我们将 14 插入到根节点的右子树的右子树中,因为 14 大于 10。
然后,我们将 4 插入到根节点的左子树的右子树的左子树中,因为 4 大于 3 且小于 6。
接着,我们将 7 插入到根节点的左子树的右子树的右子树中,因为 7 大于 6 且小于 8。
最后,我们将 13 插入到根节点的右子树的右子树的左子树中,因为 13 大于 10 且小于 14。
经过以上步骤,我们成功构造了一棵二叉排序树。
这棵树的结构如下:8。
/ \。
3 10。
/ \ \。
1 6 14。
/ \ /。
4 7 13。
这棵二叉排序树满足了所有节点的左子树值小于节点值,右子树值大于节点值的性质。
以上就是构造二叉排序树的例题过程,通过不断比较插入节点和当前节点的大小关系,我们可以构建出一个符合二叉排序树性质的树结构。
实现决策树可视化的方法决策树可视化是一种将决策树模型以图形化的方式展示出来的方法。
它能够直观地呈现出决策树的结构和节点信息,帮助用户更好地理解和解释决策树模型。
下面介绍几种实现决策树可视化的方法。
1. Graphviz:Graphviz是一种流行的图形可视化软件,可用于可视化决策树。
通过使用Graphviz提供的dot语言,我们可以将决策树的结构以图的形式展示出来。
首先,将决策树转换为.dot文件格式,然后使用Graphviz的命令行工具生成决策树的图像。
输出的图像可以保存为各种格式,如PNG、PDF等。
2. Matplotlib:Matplotlib是一个强大的绘图库,可以用于可视化决策树。
我们可以使用Matplotlib创建一个新的图形,并使用树形图的方式将决策树绘制出来。
在绘制过程中,我们可以自定义节点的样式、颜色和标签,以便更好地展示决策树的信息。
3. Plotly:Plotly是一个交互式数据可视化库,可以用于创建决策树的可视化图表。
使用Plotly,我们可以生成一个交互式的可视化图表,用户可以通过缩放、旋转和悬停来浏览决策树的各个部分。
此外,Plotly还支持将决策树通过网页发布,方便与他人共享和讨论。
4. Pydot:Pydot是一个用于创建和处理DOT语言的Python库,可以方便地将决策树生成为图像。
我们可以使用Pydot将决策树输出为图像文件,如PNG或PDF。
此外,Pydot还可以与其他库结合使用,比如在Jupyter Notebook中展示决策树图像。
综上所述,以上是几种实现决策树可视化的方法。
根据具体的需求和使用环境,我们可以选择适合自己的方法来进行决策树的可视化。
这些方法都能够帮助我们更好地理解和解释决策树模型,为决策和分析提供有力的支持。
排序算法的可视化程序c语言标题:探索排序算法的奥秘——生动实例展示C语言可视化程序引言:排序算法是计算机科学中最基础的算法之一,它的应用范围广泛,无论是数据结构还是数据库管理系统,排序算法都扮演着至关重要的角色。
为了帮助大家更好地理解排序算法的工作原理,现在我将通过一个生动全面的C语言可视化程序,向大家展示各种常见的排序算法。
一、程序设计与实现我们将使用C语言来实现排序算法的可视化程序。
通过图形化展示,我们可以清晰地观察每个排序算法的执行过程,从而更好地理解排序算法的内部机制。
下面是一些实现细节:1. 程序采用图形化用户界面(GUI)来展示排序算法的执行过程,方便观察和比较不同算法之间的差异。
2. 程序使用随机数组作为输入数据,并对其进行排序操作。
通过不同颜色来表示不同的元素值,方便观察元素的移动和交换操作。
3. 程序支持多种常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。
二、冒泡排序算法的可视化演示冒泡排序是最简单且最容易理解的排序算法之一。
它的基本思想是将待排序序列分为已排序区和未排序区,每次从未排序区中选取相邻的两个元素进行比较和交换,直到未排序区为空。
下面是冒泡排序的可视化演示:首先,程序将生成一个随机数组,我们可以在图形界面上看到一系列不同颜色的方块,每个方块代表一个数组元素。
然后,程序开始执行冒泡排序算法,将会显示出两个方块之间的比较和交换过程,交换的方块会改变颜色进行标识。
最终,当所有的比较和交换操作完成后,我们可以看到已经排好序的数组。
通过这个可视化的演示,不仅可以直观地了解冒泡排序的基本思想,还可以深入感受到排序算法的执行过程,进而理解其时间复杂度和性能优化的重要性。
三、其他排序算法的可视化演示除了冒泡排序,我们还可以使用相同的方式演示其他常见的排序算法,比如插入排序、选择排序、快速排序和归并排序等。
通过这些演示,我们可以更全面地了解不同排序算法的优劣势以及适用场景。
python可视化⼤屏库big_screen⽰例详解⽬录big_screen特点安装环境输⼊数据本地运⾏在线部署对于从事数据领域的⼩伙伴来说,当需要阐述⾃⼰观点、展⽰项⽬成果时,我们需要在最短时间内让别⼈知道你的想法。
我相信单调乏味的语⾔很难让别⼈快速理解。
最直接有效的⽅式就是将数据如上图所⽰这样,进⾏可视化展现。
具体如下:big_screen 特点便利性⼯具, 结构简单, 你只需传数据就可以实现数据⼤屏展⽰。
安装环境pip install -i https:///simple flask输⼊数据在⽂件夹 data.py 中更新你需要展⽰的数据即可,如下为部分数据展⽰:self.echart1_data = {'title': '⾏业分布','data': [{"name": "商超门店", "value": 47},{"name": "教育培训", "value": 52},{"name": "房地产", "value": 90},{"name": "⽣活服务", "value": 84},{"name": "汽车销售", "value": 99},{"name": "旅游酒店", "value": 37},{"name": "五⾦建材", "value": 2},]}self.echart2_data = {'title': '省份分布','data': [{"name": "浙江", "value": 47},{"name": "上海", "value": 52},{"name": "江苏", "value": 90},{"name": "⼴东", "value": 84},{"name": "北京", "value": 99},{"name": "深圳", "value": 37},{"name": "安徽", "value": 150},]}self.echarts3_1_data = {'title': '年龄分布','data': [{"name": "0岁以下", "value": 47},{"name": "20-29岁", "value": 52},{"name": "30-39岁", "value": 90},{"name": "40-49岁", "value": 84},{"name": "50岁以上", "value": 99},]}self.echarts3_2_data = {'title': '职业分布','data': [{"name": "电⼦商务", "value": 10},{"name": "教育", "value": 20},{"name": "IT/互联⽹", "value": 20},{"name": "⾦融", "value": 30},{"name": "学⽣", "value": 40},{"name": "其他", "value": 50},]}本地运⾏cd big_screen-master;python app.py;在线部署你可以直接像在本地⼀样运⾏脚本,这样可以运⾏成功,如果我们想让它⼀直运⾏,我们可以在线部署。