CN112199088B - 一种二叉树数据结构的可视化演变方法 - Google Patents
一种二叉树数据结构的可视化演变方法 Download PDFInfo
- Publication number
- CN112199088B CN112199088B CN202011118474.8A CN202011118474A CN112199088B CN 112199088 B CN112199088 B CN 112199088B CN 202011118474 A CN202011118474 A CN 202011118474A CN 112199088 B CN112199088 B CN 112199088B
- Authority
- CN
- China
- Prior art keywords
- node
- binary tree
- tree structure
- layout
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/34—Graphical or visual programming
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种二叉树数据结构的可视化演变方法,包括:获取在程序调试中单步执行前和后的两组二叉树结构数据;对两组二叉树结构数据进行二叉树结构逻辑对比,获取两组二叉树结构数据的结构差异信息;对两组二叉树结构数据进行结构布局对比,获取两组二叉树结构数据的布局差异信息;将结构差异信息与布局差异信息转化成可视化演变操作序列;将可视化演变操作序列中的每一个可视化演变操作解析成为特定的动画对象,对动画对象依次执行播放。本申请解决了在编程教育领域的程序调试过程中,由于二叉树结构的演变过程复杂和抽象,导致程序设计学习人员难以掌控二叉树结构的演变过程的技术问题。
Description
技术领域
本申请涉及程序设计可视化技术领域,尤其涉及一种二叉树数据结构的可视化演变方法。
背景技术
程序设计可视化工具通过对程序逻辑和代码结构进行可视化,使编程初学者直观地了解当前程序地运行状态,快速排查程序的逻辑错误,提高学习效率。
其中,数据结构可视化是程序设计可视化的一个重要组成部分。数据结构可视化指的是通过可视化技术展现一个数据结构内部各个节点之间、以及各个数据结构之间的逻辑关系。而二叉树这种数据结构又是编程学习中的一种极其重要的非线性结构,因此二叉树结构可视化是数据结构可视化的重要内容之一,其对于初学者理解和应用二叉树结构具有重要意义。二叉树结构由两部分组成:组成树的节点集合以及节点之间的逻辑关系。节点之间的逻辑关系通常由节点中的左右孩子指针域来表示。
一般的数据结构可视化技术可分为静态可视化和动态可视化两种。静态可视化侧重展示,可对某个时刻的二叉树结构的状态进行完整的绘制和呈现。
将两个二叉树结构可视化视图间的平滑过渡称为二叉树结构的演变过程。动态可视化方法为解决演变过程可视化提供了可能性,例如使用某种动画计算算法去呈现数据结构演变前和后造成的差异,使得两个可视化视图间可以平滑地衔接,改善用户对可视化图形之间变化的图形感知,有助于增进用户对程序调试过程的理解和参与度。
在数据结构可视化领域中,动态可视化的演变过程技术对于增进程序调试的理解程度和效率方面尤为明显。当用户进行程序调试时,如果用户想要知道执行当前代码行对整体数据结构的影响,则可以直观地观察在执行该行代码前和后程序中的数据结构可视化视图的变化。更为重要的是,动态可视化方法可以展现可视化视图中每一个节点或者指针的具体变化过程,包括创建、销毁、位置变化或者样式更改。通过观察这些变化过程,配合适当的交互机制,用户可以清楚地体会到数据结构是如何变化与运作的,更能深刻地掌握程序调试过程,提升程序调试效率。
现有方法中尚未发现较为完善的适用于编程教育领域中面向程序调试的二叉树数据结构针对其演变过程的动态可视化方案。
发明内容
本申请实施例提供了一种二叉树数据结构的可视化演变方法,解决了在编程教育领域的程序调试过程中,由于二叉树结构的演变过程复杂和抽象,导致程序设计学习人员难以掌控二叉树结构演变过程的技术问题。
有鉴于此,本申请提供了一种二叉树数据结构的可视化演变方法,所述方法包括:
获取在程序调试中单步执行前和后的两组二叉树结构数据;
对两组所述二叉树结构数据进行二叉树结构逻辑对比,获取两组所述二叉树结构数据的结构差异信息;
对两组所述二叉树结构数据进行结构布局对比,获取两组所述二叉树结构数据的布局差异信息;
将所述结构差异信息与所述布局差异信息转化成可视化演变操作序列;
将所述可视化演变操作序列中的每一个可视化演变操作解析成为特定的动画对象,对所述动画对象依次执行播放。
可选的,在所述在程序调试中单步执行前和后的两组二叉树结构数据,之后还包括:
对所述二叉树结构数据进行数据清洗和数据转换,得到新生成的二叉树结构数据T0和T1。
可选的,所述对两组所述二叉树结构数据进行二叉树结构逻辑对比,获取两组所述二叉树结构数据的结构差异信息,具体为:
将单步执行前和后的两组所述二叉树结构数据转换成线性结构进行存储,记为分别记为L0和L1;
将存在于L1但不存在于L0的节点称为新增节点,将所述新增节点加入到L0,得到L2;
将存在于L2但不存在于L1的节点称为被移除节点,将所述被移除节点从L2中移除,得到L3;
将L1和L3中相同的节点进行节点间的比较,获取相同节点的差异信息,所述差异信息包括节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄露树节点的信息;
所述结构差异信息包括新增节点信息、移除节点信息、节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄露树节点的信息。
可选的,所述泄露树节点的检查方法为:
若单步执行前二叉树中节点q的左孩子节点为节点p,经过单步执行后的q的左孩子节点变成了空;T(p)是以p为根的子树;
则当p是外部指针节点时,T(p)是一棵独立的树,此时没有产生泄露树;
当p是汇点时,从当前的从父节点中选取p的主父节点,此时没有产生泄露树;
当p是普通节点时,则从T(p)的子孙节点中查找是否存在所述外部指针节点或者所述汇点,若存在,则将以所述外部指针节点或者所述汇点为根的子树从T(p)中剔除,T(p)中剩余的部分为泄漏树。
可选的,所述对两组所述二叉树结构数据进行结构布局对比,获取两组所述二叉树结构数据的布局差异信息,具体为:
对单步执行后的二叉树结构数据进行二叉树布局,即分别对所述二叉树结构数据进行的树内节点间布局以及树间布局;
将二叉树布局后的两组所述二叉树结构数据中相同节点的坐标进行对比,记录相同节点的坐标差异信息。
可选的,所述对所述二叉树结构数据进行的树内节点间布局以及树间布局,具体为:
对所述二叉树结构数据中的每一棵树,从每一棵树的根节点开始,按各节点所在的层次,逐层进行节点间布局,所述节点间布局包括先由上至下进行向下排布,然后由下至上进行回推调整以消除节点位置重叠和保持对称性;
对所述二叉树结构数据进行树间布局包括:对所述二叉树结构数据进行树布局单元划分,若存在符合二叉树定义的普通树结构,则所述普通树结构单独成为一个树布局单元;若存在相连树结构,则将所述相连树结构结合成一个树布局单元;
从左到右保持预设的间距对所有所述树布局单元进行水平排布。
从以上技术方案可以看出,本申请实施例具有以下优点:
本申请实施例中,提供了一种二叉树数据结构的可视化演变方法,包括:获取在程序调试中单步执行前和后的两组二叉树结构数据;对两组二叉树结构数据进行二叉树结构逻辑对比,获取两组二叉树结构数据的结构差异信息;对两组二叉树结构数据进行结构布局对比,获取两组二叉树结构数据的布局差异信息;将结构差异信息与布局差异信息转化成可视化演变操作序列;将可视化演变操作序列中的每一个可视化演变操作解析成为特定的动画对象,对动画对象依次执行播放。
本申请通过将单步执行前和后的两组二叉树结构数据进行对比,分别获取结构差异信息与布局差异信息,再将结构差异信息与布局差异信息转化成可视化演变操作序列,通过将可视化演变操作解析成为特定的动画对象,对动画对象依次执行播放,使得解决了在编程教育领域的程序调试过程中,由于二叉树结构的演变过程复杂和抽象,导致程序设计学习人员难以掌控二叉树结构演变过程的技术问题,同时弥补了应用静态可视化技术对二叉树结构进行可视化呈现时,会产生突变的缺陷。
附图说明
图1为本申请一种二叉树数据结构的可视化演变方法的一个实施例的方法流程图;
图2为本申请一种二叉树数据结构的可视化演变方法的另一个实施例的方法流程图;
图3为本申请的一个实施例中获取两组二叉树结构数据的结构差异信息的流程示意图;
图4为本申请的一个实施例中泄露树的分析流程图;
图5为本申请的一个实施例中二叉树结构布局流程图;
图6为本申请的一个实施例中由二叉树数据结构T0和T1生成L0和L1的过程;
图7为本申请的一个实施例中由二叉树数据结构T0建立一个node_table;
图8为本申请的一个实施例中对比L1,对L0进行扩展,得到L2的流程示意图;
图9为本申请的一个实施例中对L2进行修剪的流程示意图;
图10为本申请的一个实施例中当p为外部指针节点时,潜在泄漏树的处理示意图;
图11为本申请的一个实施例中当p为汇点,根据某种规则重新选取p的主父节点的处理示意图;
图12为本申请的一个实施例中当子树T(p)中不存在汇点或者外部指针节点,PLT整体成为泄漏树的处理示意图;
图13为本申请的一个实施例中子树T(p)中存在汇点时的处理过程示意图;
图14为本申请的一个实施例中子树T(p)中存在外部指针节点时的处理过程示意图;
图15为本申请的一个实施例中进行节点间布局的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本申请一种二叉树数据结构的可视化演变方法的一个实施例的方法图,如图1所示,图1中包括:
101、获取在程序调试中单步执行前和后的两组二叉树结构数据。
需要说明的是,本申请中在对于使用了二叉树结构的程序的调试过程中,在每次单步执行前和后,可在内存中分别依次获得单步执行前二叉树结构数据以及单步执行后的二叉树结构数据。
102、对两组二叉树结构数据进行二叉树结构逻辑对比,获取两组二叉树结构数据的结构差异信息。
需要说明的是,对两组二叉树结构数据进行二叉树结构逻辑对比可以包括:将单步执行前和后的两组所二叉树结构数据转换成线性结构进行存储,记为分别记为L0和L1;将存在于L1但不存在于L0的节点称为新增节点,将新增节点加入到L0,得到L2;将存在于L2但不存在于L1的节点称为被移除节点,将被移除节点从L2中移除,得到L3;将L1和L3中相同的节点进行节点间的比较,获取相同节点的差异信息,差异信息包括节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄露树节点的信息;结构差异信息包括新增节点信息、移除节点信息、节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄露树节点的信息。
103、对两组二叉树结构数据进行结构布局对比,获取两组二叉树结构数据的布局差异信息。
需要说明的是,对两组二叉树结构数据进行结构布局对比包括:对单步执行后的二叉树结构数据进行二叉树布局,即分别对二叉树结构数据进行的树内节点间布局以及树间布局;将二叉树布局后的两组二叉树结构数据中相同节点的坐标进行对比,记录相同节点的坐标差异信息。还需要说明的是,由于在本次单步执行前,在上一次的单步执行中就已经对上一步的二叉树结构数据进行了布局;同理,本次单步执行后得到的二叉树数据的布局也将会成下一次单步执行前的二叉树数据的布局。
104、将结构差异信息与布局差异信息转化成可视化演变操作序列。
需要说明的是,本申请可以将结构差异信息与布局差异信息都转换为一个可视化演变操作,所有可视化演变操作构成一个可视化演变操作序列。
105、将可视化演变操作序列中的每一个可视化演变操作解析成为特定的动画对象,对动画对象依次执行播放。
需要说明的是,本申请可以采用绘图引擎(包括但不限于ZRender、D3、AntV G等),将得到的可视化演变操作序列中的每一个可视化演变操作解析成为特定的动画对象,将这些动画对象依次执行播放,即可可视化呈现二叉树结构变化的整个演变过程。
本申请通过将单步执行前和后的两组二叉树结构数据进行对比,分别获取结构差异信息与布局差异信息,再将结构差异信息与布局差异信息转化成可视化演变操作序列,通过将可视化演变操作解析成为特定的动画对象,对动画对象依次执行播放,使得解决了在编程教育领域的程序调试过程中,由于二叉树结构的演变过程复杂和抽象,导致程序设计学习人员难以掌控二叉树结构演变过程的技术问题,同时弥补了应用静态可视化技术对二叉树结构进行可视化呈现时,会产生突变的缺陷。
本申请还提供了一种二叉树数据结构的可视化演变方法的另一个实施例,如图2所示,图2中包括:
201、在使用了二叉树结构的程序的调试过程中,获取每次单步执行前和后的两组二叉树结构数据。
202、对二叉树结构数据进行数据清洗和数据转换,得到新生成的二叉树结构数据T0和T1。
需要说明的是,由于二叉树结构数据由编译器直接生成,存在冗余信息以及数据格式不符合可视化需求,需对二叉树结构数据进行数据清洗和数据转换,将单步执行前和后数据清洗和数据转换后的数据为T0和T1。为方便比较,为每个节点设置一个唯一标识值id(该id的取值规则可以由用户自行设定,例如可以为内存地址或对象hash值等),如果一个节点在T0中存在,并且T0演变为T1后,该节点也在T1中存在,则该节点在T0和T1中都具有相同的id。
数据清洗是指从编译器中生成的数据通常带有许多对于可视化不必要或者没意义的信息,为了减少数据冗余,需对这些多余的信息进行舍弃。
数据转换是指由编译器生成的二叉树结构数据格式通常仅适用于编译器内部执行程序时使用,未将数据进行逻辑上的联接,因此需要将其重新调整为符合二叉树结构逻辑定义的格式存储。
203、将单步执行前和后的两组二叉树结构数据转换成线性结构进行存储,记为分别记为L0和L1。
需要说明的是,二叉树结构逻辑对比的目的在于求解T0和T1间的结构差异集合(structural discrepancy,SD),可参考图3所示的二叉树结构逻辑对比阶段流程图。SD是一个包含描述二叉树结构差异信息的集合,由以下多种结构差异子集构成:
SD={SDext,SDdel,SDcpf,SDdf,SDepf,SDlt}
表1详细描述了各种结构差异子集的具体含义。
表1结构差异子集释义
本申请将单步执行前和后的两组二叉树结构数据转换成线性结构进行存储的过程具体为:首先对T0和T1分别作层次遍历,转化为线性表L0和L1存储表示。在之后的阶段,需要不断访问L0中的节点,而L0是一个线性表,因此每次访问其中的节点都需要遍历一次L0。为加快访问节点的速度,需要为L0建立一个哈希表node_table,其中需要首先对L0的每个节点设置一个唯一标识值id(该id的取值规则可以由用户自行设定,例如可以为内存地址或对象hash值等),然后将该id作为哈希表node_table的关键字key,节点本身作为value。由于本方法只对L0进行修改操作,L1仅用于对比,故只需对L0建立哈希表。图6展示了一个由T0和T1分别生成的线性结构L0和L1的示例,其节点顺序是按照对二叉树进行层次遍历得到。图7展示了如何根据T0构造出node_table的示例。其中node_table的value指向T0的节点,表示其保存的是节点的引用。由T0和T1生成L0和L1的示意图如下图6所示。
204、将存在于L1但不存在于L0的节点称为新增节点,将新增节点加入到L0,得到L2;将存在于L2但不存在于L1的节点称为被移除节点,将被移除节点从L2中移除,得到L3。
需要说明的是,在得到L0和L1后,将存在于L1而不存在于L0的节点,将新增节点记录下来,添加至L0,该步骤称为对L0进行扩展。首先对每一个节点n1∈L1,检查在L0中是否存在与n1具有相同id的节点n0∈L0,若存在,则将n0标记为已访问状态;若不存在,则将n1加入到L0,同时将n1标记为已访问。最后,将经过上述扩展的L0记为L2。同时,新增的节点组成节点差异集合SDext,该集合包含所有从L0演化至L1后的新增节点。扩展步骤执行示例如图8所示,节点A、C、E和F被标记为已访问状态,节点D和H被加入到L0同时被标记为已访问状态。
对L0进行扩展得到L2的示意图如图8所示,而得益于node_table的建立和应用,使得在每次执行检查n1是否在L0有对应的节点n0这一操作时,时间复杂度从O(n)降为O(1)。
将存在于L2但不存在于L1的节点称为被移除节点,将被移除节点从L2中移除,得到L3的过程具体为:根据L2,将存在于L2但不存在于L1节点,从L2中剔除。对L2进行遍历,检查每一个节点n0∈L2是否被标记为已访问,若发现n0未被访问过,则将n0从L2和node_table中移除。将经过上述修剪步骤的L2记为L3。同时,将被移除的节点组成节点差异集合SDdel,该集合包含所有从L0演化至L1后的被移除的节点。如图9所示,节点B和G因未被标记为已访问状态,从L2中移除,之后得到L3。
205、将L1和L3中相同的节点进行节点间的比较,获取相同节点的差异信息,差异信息包括节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄露树节点的信息;结构差异信息包括新增节点信息、移除节点信息、节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄露树节点的信息。
需要说明的是,将L1和L3中相同的节点进行节点间的比较,比较的内容包括孩子指针域的值,外部指针域的值以及数据域的值。对于每一个节点n1∈L1,在L3中查找是否存在id相同的节点,如果存在这样的节点n0∈L3,则分别对比n1和n0内对应的孩子指针域(包括左孩子指针域和右孩子指针域)、数据域和外部指针域,依次得到指针域差异集SDcpf、数据域差异集SDdf和外部指针域差异集SDepf。(一个节点受一个或多个外部指针指向,为了能在访问节点内容的同时能识别出节点受哪些外部指针指向,需在节点内再添加一个外部指针域,用于记录指向该节点的外部指针)。
若发现n0的孩子指针域的值非空,但n1对应孩子指针域为空,则表明在执行一步程序调试后,该节点的孩子指针域由“非空”被置为“空”。此时不妨将该节点的原孩子节点记为p,以p为根的子树记为T(p),在此情况下,T(p)有可能会包含发生了内存泄漏的树结构,因此称T(p)为潜在泄漏树PLT。此时,需要对T(p)进行泄漏树分析和处理,检查并分析T(p)或者T(p)中的部分结构是否为泄漏树结构。如果分析得到泄漏树,则需将泄漏树中的节点组成泄漏节点子集SDlt。
在一种具体的实施方式中,可参考图4所示的泄漏树分析流程示意图,泄露树节点的检查方法包括:
若单步执行前二叉树中节点q的左孩子节点为节点p,经过单步执行后的q的左孩子节点变成了空;T(p)是以p为根的子树;
则当p是外部指针节点时,T(p)是一棵独立的树,此时没有产生泄露树;
当p是汇点时,从当前的从父节点中选取p的主父节点,此时没有产生泄露树;
当p是普通节点时,则从T(p)的子孙节点中查找是否存在外部指针节点或者汇点,若存在,则将以外部指针节点或者汇点为根的子树从T(p)中剔除,T(p)中剩余的部分为泄漏树。
需要说明的是,泄漏树产生的根本原因,是在执行一步程序调试后,由于某些节点指针域的改变,导致与其关联的子树结构失去了指针的指向,从而不能再被访问,但是该子树结构仍存在于内存,因此被造成了内存泄漏,这部分子树结构就是泄漏树。在进行数据结构可视化时,泄漏树需要在泄漏区被单独可视化出来,而不是简单地从可视化视图中擦除,否则会让用户疑惑:在程序中并没有调用内存释放函数释放某节点所占的内存,但该节点却在可视化视图中消失了。此时用户很难意识到是发生了内存泄漏。对泄漏树的可视化能使得初学者在对发生内存泄漏的程序逻辑错误时,能够更加便捷地定位错误,提升程序调试效率。
判定泄漏树的关键在于执行某步程序调试后,对所有可能发生内存泄露的二叉树结构进行遍历,检查该PLT或其子树结构是否存在指针指向。具体而言,判断该PLT或其子树结构是否存在指针指向的关键又是在于,检查在该PLT或其子树结构中,是否存在汇点或外部指针节点。最后,将确定成为泄漏树的节点记录为SDlt。
如果存在汇点或外部指针节点,由于这些节点有多个指针指向,所以以汇点或外部指针节点为根的子树部分都仍然能够被访问到,因此这一部分不会成为泄漏树。
设p为某潜在泄漏树PLT的根节点,由于PLT肯定为其原所属二叉树的子树,所以根据一般子树的表示方法,可以将该PLT记为T(p)。在下述陈述中,如果是表达一般抽象意义的潜在泄漏树,则使用PLT;如果要强调与潜在泄漏树的根节点相关的内容时,则使用T(p)。项目根据p所属的节点类型分别讨论:
1、当p为外部指针节点时(若节点v存在多个指针指向,那么将除来自父节点的指针,其余都称为外部指针。若v存在指向它自身的外部指针,则v为外部指针节点)。将潜在泄漏树将从原来所属的二叉树结构分离出来,使之成为一棵独立的二叉树。而p作为外部指针节点,则意味着肯定存在其它指针指向p,因此整棵潜在泄漏树PLT仍然可被访问,因而PLT或其部分子树都不会成为泄漏树。如图10(a)和图10(b)所示,p为外部指针节点,因此在断开p与原父节点的指针后,T(p)整体成为了单独的树结构,同时没有产生泄漏树。
2、当p为汇点(若节点v存在一个主父节点,且至少存在一个从父节点,则称v为汇点,其中若节点v只有一个父节点,那么该父节点即是v的主父节点。若v存在多个父节点,则根据这些父节点的生成时间先后,规定首个成为v父节点的节点为主父节点,其余父节点则为从父节点。若v因某种原因失去主父节点,那么则需按照某种规则在从父节点中选取一个作为新的主父节点)时。
若T(p)从原来所属的二叉树结构中分离出来时,还存在主父节点,则表明在当前调试单步执行后,断开的是来自从父节点的指针。此时潜在泄漏树由于仍然可以通过它的从父节点来访问,因此没有生成真正的泄漏结构,只需保持当前二叉树结构的逻辑表示,无需特别处理。
若T(p)从原来所属的二叉树结构中分离出来时,若p此时已不存在主父节点,说明当前调试单步执行后,断开的是来自主父节点的指针。此时,需要遵从某种规则,从从父节点中选取一个节点作为主父节点(选取规则可以由用户另行指定,包括但不限于按照从父节点的生成次序等)。如图11(a)所示,p的原主父节点即将断开指向p的指针(虚线箭头表示);断开后如图11(b)所示,p的一个原从父节点成为新的主父节点。
3、p为除了上述外部指针节点和汇点之外的普通节点。
若T(p)中不存在汇点或者外部指针节点,则整棵潜在泄漏树PLT成为真正的泄漏树结构。如图12(a)所示,PLT中没有任何汇点或者外部指针节点;因此T(p)从原来所属的二叉树结构中分离出来后,T(p)的所有都为普通节点,因此整个PLT成为泄漏树,如图12(b)所示。
若T(p)中存在汇点或外部指针节点。为方便表示,称任意一个T(p)中的汇点或外部指针节点为c,记T(c)为以c为根的子树。由于存在其它指针指向节点c(一种情况是c是汇点,则“其它指针”可以是c的父节点的孩子指针;另一种情况是c被某外部指针指向),使得T(c)中所有节点都可以被访问到,所以T(c)不会成为泄露树结构。从PLT中剪除所有T(c),剩下的部分将成为泄漏树结构,因为这一部分不会再有其它任何指针指向。
图13展示了T(p)中存在汇点的情况。图13(a)中p的原父节点将断开与p的指针,PLT中有来自其他树结构的从父节点指向的汇点c。图13(b)中,对于c,重新选取其从父节点作为主父节点,同时在T(p)中,除了以c为根的子树之外的部分(记为T(p)-T(c))成为了真正的泄漏树。
图14展示了T(p)中存在外部指针节点的情况。图14(a)中p的原父节点将断开与p的指针(用虚线箭头表示),PLT中存在外部指针节点c。图14(b)中,以c为根的子树T(c)被分离出来成为一棵单独的二叉树结构;同时在T(p)中,除了以T(c)之外的部分(记为T(p)-T(c))成为了真正的泄漏树。
206、对两组二叉树结构数据进行二叉树布局,即分别对二叉树结构数据进行的树内节点间布局以及树间布局。
需要说明的是,对二叉树T0和T1分别进行布局,可得到它们各自对应的布局参数。然后通过对比T0和T1的布局参数,可计算出它们在布局参数上的差异。其中T0的布局参数在程序调试中单步执行前已知,而T1则需要在程序调试中单步执行后,再对其进行逻辑布局,以获得它的布局参数。将两者的布局参数对比结果称为位置差异集合(positionaldiscrepancy,PD)。具体而言,PD是记录T0和T1中相同id的节点的坐标位置差异信息的集合(没有对T0进行布局的原因是在本步程序调试执行前,由上一步的程序调试就已经对T0进行了布局;同理,本步调试得到的T1的布局也将会成下一步调试的T0的布局)。
本申请二叉树结构布局方法分为两个层次:第一个层次是进行二叉树内的节点间布局,以二叉树内的节点为基本单位,分别进行水平方向和垂直方向上的布局,以此确定二叉树内各节点的相对位置。第二个层次是进行各二叉树之间的布局,以整个二叉树结构为基本单位,确定各二叉树结构之间的相对位置,其具体的二叉树结构布局阶段流程图可参考图5。
其中,对于某个节点,节点间布局的作用是确定该节点与它的主父节点和它的兄弟节点之间的相对位置,同时保证子树间不会发生节点重叠和边的互相交叉,以及保持主父节点位于左孩子节点和右孩子节点的之间的水平居中位置,具体可分为两个步骤:
S101:从二叉树的根节点开始进行先序遍历整棵二叉树,对每一个节点的左右孩子节点,进行以该结点为中心、dx为水平间距的对称排布,使它的左右孩子节点位于该节点的左右两侧;同时,以dy为垂直间距,将该节点的左右孩子节点置于该结点下方。该步骤称为下降排布。如图15所示是一个示意性举例。然而可以注意到,此时在水平方向上,相邻非兄弟节点有可能发生重叠,例如在图15(a)中,节点B的右孩子节点与节点C的左孩子节点发生了重叠。
S102:从树的叶子节点开始,从下往上对树按层次遍历,检查并确保水平方向上相邻非兄弟节点间的水平间距不小于dx,若发现相邻非兄弟节点间的水平间距小于dx,则需要对这两个相邻非兄弟节点进行水平位移,直到水平间距满足dx为止。而原本子节点应对称分布在主父节点下方两侧,但此时因位移调整导致子节点偏移,子节点不再相对于主父节点对称,则称主父节点失去了对称性。为解决主父节点失去对称性的问题,需进一步水平移动主父节点的位置,使该主父节点在水平方向上,位于它的两个孩子节点的中央。对二叉树的每一层次都依次执行该步骤,至根节点后结束。该步骤称为回推调整。
图15(b)展示了调整后的布局状态。图中发生重叠的节点为节点E和节点F,将以节点F的主父节点(即节点C)为根的子树整体往右水平平移,直至节点E和节点F的水平间距为dx。然后此时节点A相对于其左右孩子节点(节点B和节点C)会失去对称性,因此需再对A进行水平平移,直至节点A位于节点B和节点C的中央。
另外,当完成所有二叉树内的节点间布局后,记T1中所有二叉树结构构成的树集合为S={R1,R2,…Rm},再对S进行树间布局,其步骤包括:
S201、对S进行树布局单元的识别和划分树布局单元:对树Ri∈S(i=1,2,…,m),若Ri是不包含任何汇点的常规二叉树,则将Ri划分为一个树布局单元;若S中存在多棵树,且这些树组成一个相连树结构,则该相连树结构也被划分为一个树布局单元。
S202、从第一个树布局单元开始,在水平方向上,以dt为间距,从左往右进行树布局单元的水平摆放;若某树布局单元是相连树结构,则对于所有组成该树布局单元的常规二叉树或者相连树,在水平方向上都相邻。
其中,dx,dy和dt是由算法指定或者用户自定义的一个变量,类型为整型或者浮点型。其中dx表示两个节点间的水平距离值,dy表示孩子节点和主父节点的垂直距离值,dt表示树布局单元之间的水平距离值。
207、将二叉树布局后的两组二叉树结构数据中相同节点的坐标进行对比,记录相同节点的坐标差异信息。
需要说明的是,对于T1中的每一个节点ni,在T0中找到与ni具有id相同的节点ncor,将ni与ncor进行坐标对比,即可得到ni与ncor之间的布局差异集合PDi=<Δx,Δy>,其中Δx是ni与ncor的横坐标之差;Δy是ni与ncor的纵坐标之差。由上述步骤,可得所有id相同的节点的布局差异集合PD={PD0,PD1,PD2,……,PDm}。
208、将结构差异信息与布局差异信息转化成可视化演变操作序列。
需要说明的是,将通过结构对比得到的结构差异集合SD和通过布局对比得到的布局差异集合PD统称为差异集合(discrepancy,D),记作D=SD∪PD。为了进行二叉树结构演变过程视图的可视化视图的绘制,现将差异集合D中的每一个元素d∈D映射为一个可视化演变操作op∈Operation。表2给出了所有可视化演变操作的种类,并且给出了D中每一种差异与唯一的可视化演变操作之间的对应关系。依次将D中每一个元素映射而得的可视化演变操作按先后顺序排列,构成一个可视化演变操作序列(Operation List,OL),记为OL={op0,op1,op2,……,opw},0≤i≤w,opi∈Operation。
表2对应规则及可视化演变操作释义
209、将可视化演变操作序列OL中的每一个可视化演变操作解析成为特定的动画对象,对动画对象依次执行播放。
需要说明的是,将得到的可视化演变操作序列OL进行应用,以可视化呈现二叉树结构的演变过程。首先为OL中的每一个可视化演变操作赋予一个唯一的标记tag;然后调用绘图引擎(如ZRender,D3,AntV G等)识别这些tag,创建对应的动画对象;最后将这些动画对象依次播放,就可以以T0的可视化视图为初始状态,以动画形式呈现从T0演变至T1的可视化效果,以及将泄漏树LT(如果有)平滑移动至泄漏区的可视化效果。
以使用绘图引擎ZRender为例,将可视化演变操作序列OL转换为动画对象并呈现至可视化视图的具体步骤为:
S901:遍历可视化演变操作序列OL,根据可视化演变操作的tag和描述动画所需的参数(例如位移的起点坐标和终点坐标),使用ZRender的animate函数生成对应的动画对象,并且将这些动画对象保存为一个动画对象序列。
S902:检查动画执行标志,若为true,则说明上一个动画序列的动画对象尚未执行完毕,所以需要挂起当前想要执行的动画对象序列,直至上一个动画对象序列的动画对象全部执行完成,进入S903;否则直接进入S903。(动画执行标志是一个用作防止前后两次动画发生冲突的变量,通常为布尔值。当其值为true时,表示上一个动画对象序列中的动画对象还没执行完毕,还不能执行下一个动画对象序列,否则会出现动画被打断或者动画效果与预期不符的不良结果。当上一个动画对象序列中的所有动画对象执行完成后,动画执行标志的值便会被置为false;而当某个动画对象序列开始执行时,又会将该标志置为true)。
S903:遍历动画对象序列,对每一个动画对象,调用start函数,并传入给定的或由用户自定义的动画时长和缓动函数名称,执行该动画。当动画序列中所有动画都执行完成时,将动画执行标志的值置为false。(缓动函数是决定动画效果运动快慢的函数。详细说就是定义不同曲线的数据公式,描述每一帧动画需要改变的图形变化幅度,从而达到均匀、先快后慢、先慢后快,甚至先超出起始值和结束值再慢慢恢复等各种动画特效)。
ZRender是面向网页绘图技术的一个绘图引擎,因此在执行ZRender的animate函数生成的动画对象时,底层会操纵HTML的Canvas元素进行图形绘制和图形擦除,图形绘制和图形擦除快速交替进行便可得到动画效果。
本申请通过将单步执行前和后的两组二叉树结构数据进行对比,分别获取结构差异信息与布局差异信息,再将结构差异信息与布局差异信息转化成可视化演变操作序列,通过将可视化演变操作解析成为特定的动画对象,对动画对象依次执行播放,使得解决了在编程教育领域的程序调试过程中,由于二叉树结构的演变过程复杂和抽象,导致程序设计学习人员难以掌控二叉树结构演变过程的技术问题,同时弥补了应用静态可视化技术对二叉树结构进行可视化呈现时,会产生突变的缺陷。另外,本申请在对二叉树结构逻辑对比时,首先将二叉树结构转换为线性结构表示,分别进行线性结构间以及节点间的对比,获取两个二叉树结构在结构上的差别。该方法中进行的比较都是基于线性表示的二叉树来进行的,其效率远高于基于递归遍历方式来进行二叉树结构比较的方法。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本申请中术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
应当理解,在本申请中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:只存在A,只存在B以及同时存在A和B三种情况,其中A,B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”,其中a,b,c可以是单个,也可以是多个。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。
Claims (4)
1.一种二叉树数据结构的可视化演变方法,其特征在于,包括:
获取在程序调试中单步执行前和后的两组二叉树结构数据;
对两组所述二叉树结构数据进行二叉树结构逻辑对比,获取两组所述二叉树结构数据的结构差异信息;
所述对两组所述二叉树结构数据进行二叉树结构逻辑对比,获取两组所述二叉树结构数据的结构差异信息,具体为:
将单步执行前和后的两组所述二叉树结构数据转换成线性结构进行存储,分别记为L0和L1;
将存在于L1但不存在于L0的节点称为新增节点,将所述新增节点加入到L0,得到L2;
将存在于L2但不存在于L1的节点称为被移除节点,将所述被移除节点从L2中移除,得到L3;
将L1和L3中相同的节点进行节点间的比较,获取相同节点的差异信息,所述差异信息包括节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄漏树节点的信息;
所述结构差异信息包括新增节点信息、移除节点信息、节点内指针域变化的信息、节点内数据域变化的信息、节点的外部指针域变化的信息以及泄漏树节点的信息;
对两组所述二叉树结构数据进行结构布局对比,获取两组所述二叉树结构数据的布局差异信息;所述布局差异信息包括相同节点的坐标差异信息;
所述对两组所述二叉树结构数据进行结构布局对比,获取两组所述二叉树结构数据的布局差异信息,具体为:
对单步执行后的二叉树结构数据进行二叉树布局,即分别对所述二叉树结构数据进行的树内节点间布局以及树间布局;
将二叉树布局后的两组所述二叉树结构数据中相同节点的坐标进行对比,记录相同节点的坐标差异信息;
将所述结构差异信息与所述布局差异信息转化成可视化演变操作序列;
将所述可视化演变操作序列中的每一个可视化演变操作解析成为特定的动画对象,对所述动画对象依次执行播放。
2.根据权利要求1所述的二叉树数据结构的可视化演变方法,其特征在于,在所述在程序调试中单步执行前和后的两组二叉树结构数据,之后还包括:
对所述二叉树结构数据进行数据清洗和数据转换,分别得到新生成的二叉树结构数据T0和T1。
3.根据权利要求1所述的二叉树数据结构的可视化演变方法,其特征在于,所述泄漏树节点的检查方法为:
若单步执行前二叉树中节点q的左孩子节点为节点p,经过单步执行后的q的左孩子节点变成了空;T(p)是以p为根的子树;
则当p是外部指针节点时,T(p)是一棵独立的树,此时没有产生泄漏树;
当p是汇点时,从当前的从父节点中选取p的主父节点,此时没有产生泄漏树;
当p是普通节点时,则从T(p)的子孙节点中查找是否存在所述外部指针节点或者所述汇点,若存在,则将以所述外部指针节点或者所述汇点为根的子树从T(p)中剔除,T(p)中剩余的部分为泄漏树。
4.根据权利要求1所述的二叉树数据结构的可视化演变方法,其特征在于,所述对所述二叉树结构数据进行的树内节点间布局以及树间布局,具体为:
对所述二叉树结构数据中的每一棵树,从每一棵树的根节点开始,按各节点所在的层次,逐层进行节点间布局,所述节点间布局包括先由上至下进行向下排布,然后由下至上进行回推调整以消除节点位置重叠和保持对称性;
对所述二叉树结构数据进行树间布局包括:对所述二叉树结构数据进行树布局单元划分,若存在符合二叉树定义的普通树结构,则所述普通树结构单独成为一个树布局单元;若存在相连树结构,则将所述相连树结构结合成一个树布局单元;
从左到右保持预设的间距对所有所述树布局单元进行水平排布。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011118474.8A CN112199088B (zh) | 2020-10-19 | 2020-10-19 | 一种二叉树数据结构的可视化演变方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011118474.8A CN112199088B (zh) | 2020-10-19 | 2020-10-19 | 一种二叉树数据结构的可视化演变方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112199088A CN112199088A (zh) | 2021-01-08 |
CN112199088B true CN112199088B (zh) | 2023-07-25 |
Family
ID=74009340
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011118474.8A Active CN112199088B (zh) | 2020-10-19 | 2020-10-19 | 一种二叉树数据结构的可视化演变方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112199088B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115048096B (zh) * | 2022-08-15 | 2022-11-04 | 广东工业大学 | 一种数据结构动态可视化方法和系统 |
CN116089056B (zh) * | 2022-08-22 | 2023-10-20 | 荣耀终端有限公司 | 用于图像绘制的方法及相关装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102411534A (zh) * | 2011-07-25 | 2012-04-11 | 中国科学院声学研究所 | 一种断点调试方法和调试器 |
CN104679775A (zh) * | 2013-12-02 | 2015-06-03 | 上海联影医疗科技有限公司 | 一种基于Huffman表的数据处理方法 |
CN107391222A (zh) * | 2017-08-14 | 2017-11-24 | 广东工业大学 | 一种过程可视化的代码执行方法及装置 |
CN108920367A (zh) * | 2018-06-28 | 2018-11-30 | 广东工业大学 | 一种数据结构可视化调试方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8751823B2 (en) * | 2011-08-01 | 2014-06-10 | Apple Inc. | System and method for branch function based obfuscation |
-
2020
- 2020-10-19 CN CN202011118474.8A patent/CN112199088B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102411534A (zh) * | 2011-07-25 | 2012-04-11 | 中国科学院声学研究所 | 一种断点调试方法和调试器 |
CN104679775A (zh) * | 2013-12-02 | 2015-06-03 | 上海联影医疗科技有限公司 | 一种基于Huffman表的数据处理方法 |
CN107391222A (zh) * | 2017-08-14 | 2017-11-24 | 广东工业大学 | 一种过程可视化的代码执行方法及装置 |
CN108920367A (zh) * | 2018-06-28 | 2018-11-30 | 广东工业大学 | 一种数据结构可视化调试方法 |
Non-Patent Citations (1)
Title |
---|
二叉树结构的文本模式显示;江顺亮;任燕;;电脑知识与技术(16);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN112199088A (zh) | 2021-01-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Bosca et al. | OntoSphere: more than a 3D ontology visualization tool. | |
Von Landesberger et al. | Visual analysis of large graphs: state‐of‐the‐art and future research challenges | |
Gall et al. | Visualizing software release histories: The use of color and third dimension | |
US6373484B1 (en) | Method and system for presenting data structures graphically | |
US5278946A (en) | Method of presenting multimedia data in a desired form by comparing and replacing a user template model with analogous portions of a system | |
CN112199088B (zh) | 一种二叉树数据结构的可视化演变方法 | |
JP2008084114A (ja) | オントロジー統合支援装置、オントロジー統合支援方法及びオントロジー統合支援プログラム | |
JP2000067086A (ja) | ノ―ド―リンクデ―タ取得方法 | |
Karran et al. | Synctrace: Visual thread-interplay analysis | |
Liao et al. | Cluster-based visual abstraction for multivariate scatterplots | |
Meng et al. | Clutter-aware label layout | |
CN113901231A (zh) | 一种知识图谱的演进分析方法、装置及介质 | |
JPH07110761A (ja) | 実体関連図を記憶及び表示するための方法並びにコンピュータ・システム | |
Fleischer et al. | Graph drawing and its applications | |
Jiang et al. | Log-it: Supporting Programming with Interactive, Contextual, Structured, and Visual Logs | |
CN110162731B (zh) | 一种IFC模型构件空间信息在Web显示的方法 | |
Burch et al. | A scalable visualization for dynamic data in software system hierarchies | |
Cakmak et al. | dg2pix: Pixel-based visual analysis of dynamic graphs | |
Nakagawa et al. | A method for continuous speech segmentation using HMM | |
Saied et al. | Visualization based API usage patterns refining | |
Bosca et al. | OntoSphere3D: a multidimensional visualization tool for ontologies | |
Lemieux et al. | Visualization techniques for program comprehension | |
CN114722112A (zh) | 一种可视化列表数据展示方法及其装置 | |
Von Pilgrim | Mental map and model driven development | |
Cyre et al. | Knowledge visualization from conceptual structures |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |