效果图如下:
1、根据数据源的层级关系构造 树型的数据,并根据层次给每层数据赋于TREE_LEVEL数据
protected function convertToTree(startData:Object,level:Number=0):void { if(startData != null) { level++ ; var children:Array = getChildrenNode(startData) ; startData.children = children ; for each(var data:Object in children) { convertToTree(data,level) ; } startData.TREE_LEVEL = level ; } }
2、根据数据,创建对应的节点,并把节点与数据进行绑定
protected function mapDataToNode(startData:Object,startNode:BinaryTreeNode):void { if(startData == null || startNode == null) { return ; } var dataArray:Array = startData.children ; if(dataArray.length == 1 ) { var newNode:BinaryTreeNode = createNode(startNode); newNode.data = dataArray[0] ; startNode.children.itemUpdated(newNode,"data") ; mapDataToNode(dataArray[0],newNode) ; } if(dataArray.length == 2 ) { var leftNode:BinaryTreeNode = createNode(startNode); var rightNode:BinaryTreeNode = createNode(startNode); leftNode.data = dataArray[0] ; rightNode.data = dataArray[1] ; startNode.children.itemUpdated(leftNode,"data") ; startNode.children.itemUpdated(rightNode,"data") ; mapDataToNode(dataArray[0],leftNode) ; mapDataToNode(dataArray[1],rightNode) ; } }
3、获取最后一级的节点
protected function getVirtualLast(last:Array,startNode:BinaryTreeNode):Array { if(startNode != null) { if(startNode.children && startNode.children.length == 0) { startNode.isLeaf = true ; last.push(startNode) ; } for each (var child:BinaryTreeNode in startNode.children) { getVirtualLast(last,child) ; } } return last ; }
4、比较很容易的定位最后一级的位置
如果是垂直排列,则
Y坐标为(level - 1) * (VERTICAL_HEIGHT + lastNode.defaultHeight) + TOP_PADDING
如果前一个节点为它的兄弟节点,则 X坐标为preNode.vx + BROTHER_GAP + node.defaultWidth ;
否则X坐标为LEFT_PADDING
if(_direction == "vertical") { lastNode.x = LEFT_PADDING ; lastNode.y = (level - 1) * (VERTICAL_HEIGHT + lastNode.defaultHeight) + TOP_PADDING ; for (var i:int=1;i<last.length;i++) { var node:BinaryTreeNode = last[i] as BinaryTreeNode ; var preNode:BinaryTreeNode = last[i-1] as BinaryTreeNode ; var nodeParent:BinaryTreeNode = node.superNode ; if(nodeParent == null) { return ; } if(ArrayUtil.arrayContainsValue(nodeParent.children.toArray(),preNode)) { node.x = preNode.x + BROTHER_GAP + node.defaultWidth ; } else { node.x = preNode.x + GAP + node.defaultWidth ; } node.y = (node.level - 1) * (VERTICAL_HEIGHT + node.defaultHeight) + TOP_PADDING ; } }
5、根据最后一层的位置,推算出其他层的位置
先对最后一层,按level进行排序,先推算最底层的父节点
如果父节点有两个小孩,则父节点的 X坐标为 parentNode.x = ((parentNode.children[0] as BinaryTreeNode).x + ((parentNode.children[1] as BinaryTreeNode).x)) / 2 ;;
如果只有一个小孩,则父节点的 X坐标为parentNode.x = childNode.x;
Y坐标为parentNode.y = childNode.y - childNode.defaultHeight - VERTICAL_HEIGHT ;
var fixArray:Array = new Array() ; fixedArray.sortOn("level", Array.DESCENDING | Array.NUMERIC); if(_direction == "vertical") { for(var i:int=0;i<fixedArray.length ; i++) { var childNode:BinaryTreeNode = fixedArray[i] as BinaryTreeNode ; var parentNode:BinaryTreeNode = childNode.superNode ; if(parentNode == null) { continue; //return ; } if(parentNode.children.length == 2) { parentNode.x = ((parentNode.children[0] as BinaryTreeNode).x + ((parentNode.children[1] as BinaryTreeNode).x)) / 2 ; //两个孩子 确定一个父,所以他兄弟 不需要再循环了 i++ ; } else if(parentNode.children.length == 1) { parentNode.x = childNode.x; } parentNode.y = childNode.y - childNode.defaultHeight - VERTICAL_HEIGHT ; fixArray.push(parentNode) ; } if(fixArray.length > 0) { fixPostion(fixArray) ; } }
6、根据位置设置节点是在左边还是右边
if(_direction == "vertical") { for each(var n:BinaryTreeNode in children) { if(n.data) { if(n.x < node.x) { n.position = "left" ; } if(n.x > node.x) { n.position = "right" ; } if(n.x == node.x) { n.position = "direct" ; } children.itemUpdated(n) ; validatePostion(n) ; } } }
7、锁定线的位置
var children:ArrayCollection = startNode.children ; var searchReuslt:Array = ArrayUtil.getItemsByField(children.toArray(),null,"data") as Array; if(searchReuslt && searchReuslt.length == 1) { var node:BinaryTreeNode = (children[0].data == null ? children[1] : children[0]) as BinaryTreeNode ; if(node.line &&_canvas.contains(node.line)) { _canvas.removeChild(node.line) ; } node.line = new BinaryTreeLine() ; if(_direction == "vertical") { node.line.position = BinaryTreeLine.POSITION_L ; node.line.height = VERTICAL_HEIGHT - Locker.LOCKER_HEIGHT ; node.line.width = 0 ; node.line.x = node.x + node.defaultWidth / 2 ; node.line.y = node.y - VERTICAL_HEIGHT + Locker.LOCKER_HEIGHT ; node.line.direction = "VERTICAL" ; node.direction = "VERTICAL" ; } else { node.line.position = BinaryTreeLine.POSITION_D ; node.line.width = HORIZONAL_WIDTH - Locker.LOCKER_HEIGHT ; node.line.height = 0 ; node.line.y = node.y + node.defaultHeight / 2 ; node.line.x = node.x - HORIZONAL_WIDTH + Locker.LOCKER_HEIGHT ; node.line.direction = "HORIZONAL" ; node.direction = "HORIZONAL" ; } if(lineField && lineField != "" && node.data) { node.line.text = node.data[lineField] ; } fixLinePosition(node) ; }
8、根据最大和最小的X Y值设置 measuredWidth measuredHeight 以便出现滚动条
并加入到舞台中。
_canvas.x = 0 ; _canvas.y = 15 ; _canvas.measuredWidth = maxX - minX + startNode.defaultWidth + TOP_PADDING ; _canvas.measuredHeight = maxY - minY + startNode.defaultHeight + LEFT_PADDING ; _canvas.setActualSize(_canvas.measuredWidth,_canvas.measuredHeight) ; addChildrenToContainer(startNode) ; _canvas.addChild(startNode) ;
相关推荐
### 二叉树实现简易计算器 #### 概述 本文档介绍了一个利用二叉树来实现简易计算器的程序。...这种实现方式不仅适用于简单的数学表达式处理,也为理解和学习数据结构及算法提供了一个很好的案例。
- **设计目标**:本实验旨在让学生掌握中序线索二叉树的概念及其应用,重点在于实现中序线索二叉树的创建和查找后继节点的方法。 - **功能设计要求**: - 定义线索二叉树类型`thread_bitree`。 - 实现中序线索...
建立二叉树,实现二叉树的先序、中序、后序的递归遍历算法,输出遍历结果。 实现二叉树的先序、中序、后序和层次遍历的非递归算法,输出遍历结果。
描述部分提到该资源为txt文本,内容包括实现思路与具体代码实现,仅供学习参考使用,不得用于商业目的。 #### 标签解析: - **二叉树**:数据结构的一种,每个节点最多有两个子节点。 - **多项式**:代数学中的基本...
在C++中实现二叉树,我们需要理解其基本操作,并能有效地进行创建、遍历、查找、插入和删除等操作。 1. **二叉树的定义**: 二叉树由节点组成,每个节点包含一个值、指向左子节点的指针(如果存在)和指向右子节点...
利用二叉顺序树实现一个动态查找表,实现动态查找表的三项基本功能:查找,插入,删除操作。开始进行顺序二叉树的建立,输入元素的个数以及元素,动态创建一个二叉树,然后进行选择对二叉顺序树进行的操作,即选择,...
本项目“平衡二叉树实现学生成绩管理”正是基于这种数据结构,实现了学生成绩的有效管理。 首先,我们要理解平衡二叉树的核心概念。常见的平衡二叉树有AVL树和红黑树等。AVL树要求任意节点的两个子树高度差不超过1...
二叉树是一种特殊的树结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。...通过`main.cpp`、`bintree.h` 和 `bintreenode.h` 这些文件,我们可以学习到如何在C++中实现和使用二叉树。
二叉树 二叉树最基本的实现。建立插入删除等操作。 二叉树听会了代码还是不会敲啊。。。。
"线索化二叉树的实现" 在计算机科学中,二叉树是一种重要的数据结构,它广泛应用于各种领域,如数据库、文件系统、编译器等。线索化二叉树是一种特殊的二叉树,它在二叉树的每个节点中添加了指向其前驱和后继节点的...
二叉树是一种重要的数据结构...总结起来,二叉树是Java编程中一个重要的数据结构,理解和掌握其原理及实现方式对于提升编程能力至关重要。通过分析和实践,你可以深入理解二叉树的特性,并将其应用到实际问题的解决中。
二叉树实现源代码 经典版c++源码 *建立二叉树算法描述: 用ch扫描采用括号表示法表示二叉树的字符串Str。分以下几种情况: 1、若ch='('则将前面刚创建的结点作为双亲结点进栈,并置k=1,表示其后创建的结点将做为这...
java二叉树实现 (简单实现,入门用) /**创建二叉树*/ public BinaryTree createTree(String treeStr); /**寻找结点*/ public BinaryTree findNode(BinaryTree tree ,char sign); /**找所给结点的左子树*/ ...
在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树的原理和C++实现。 首先,我们要明确二叉树的基本概念。二叉树是由n(n>=0)个有限节点组成的数据结构,这些节点通过边...
这个集合或者为空(称为空二叉树),或者由一个根节点及两个不相交的、分别称为左子树和右子树的二叉树组成。二叉树的深度是树中最大路径长度,而节点数决定了树的大小。 **2. 主要类型** - 完全二叉树:除最后一层...
在这个“二叉树实现”项目中,我们主要关注的是利用二叉树来实现排序以及展示其节点遍历。 首先,`Tree.cpp`文件可能包含了二叉树类的实现。在C++中,一个二叉树的节点通常会定义为包含数据、指向左子节点和右子...
2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问结点的操作修改为叶结点计数,统计度为0的;度为1...
(3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。 (8...
山东大学数据结构课设二叉树实现及分析