`

Flex 二叉树的实现及思路

    博客分类:
  • FLEX
 
阅读更多

效果图如下:



 

 

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) ;

 

        

  • 大小: 6.1 KB
分享到:
评论

相关推荐

    二叉树实现简易计算器

    ### 二叉树实现简易计算器 #### 概述 本文档介绍了一个利用二叉树来实现简易计算器的程序。...这种实现方式不仅适用于简单的数学表达式处理,也为理解和学习数据结构及算法提供了一个很好的案例。

    c++二叉树实现代码

    - **设计目标**:本实验旨在让学生掌握中序线索二叉树的概念及其应用,重点在于实现中序线索二叉树的创建和查找后继节点的方法。 - **功能设计要求**: - 定义线索二叉树类型`thread_bitree`。 - 实现中序线索...

    二叉树建立及遍历算法实现

    建立二叉树,实现二叉树的先序、中序、后序的递归遍历算法,输出遍历结果。 实现二叉树的先序、中序、后序和层次遍历的非递归算法,输出遍历结果。

    利用二叉树实现多项式计算

    描述部分提到该资源为txt文本,内容包括实现思路与具体代码实现,仅供学习参考使用,不得用于商业目的。 #### 标签解析: - **二叉树**:数据结构的一种,每个节点最多有两个子节点。 - **多项式**:代数学中的基本...

    二叉树实现-二叉树操作

    在C++中实现二叉树,我们需要理解其基本操作,并能有效地进行创建、遍历、查找、插入和删除等操作。 1. **二叉树的定义**: 二叉树由节点组成,每个节点包含一个值、指向左子节点的指针(如果存在)和指向右子节点...

    平衡二叉树程序实现及完整文档

    利用二叉顺序树实现一个动态查找表,实现动态查找表的三项基本功能:查找,插入,删除操作。开始进行顺序二叉树的建立,输入元素的个数以及元素,动态创建一个二叉树,然后进行选择对二叉顺序树进行的操作,即选择,...

    平衡二叉树实现学生成绩管理

    本项目“平衡二叉树实现学生成绩管理”正是基于这种数据结构,实现了学生成绩的有效管理。 首先,我们要理解平衡二叉树的核心概念。常见的平衡二叉树有AVL树和红黑树等。AVL树要求任意节点的两个子树高度差不超过1...

    二叉树类 及 实现

    二叉树是一种特殊的树结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。...通过`main.cpp`、`bintree.h` 和 `bintreenode.h` 这些文件,我们可以学习到如何在C++中实现和使用二叉树。

    二叉树实现-最基本的二叉树

    二叉树 二叉树最基本的实现。建立插入删除等操作。 二叉树听会了代码还是不会敲啊。。。。

    线索化二叉树的实现

    "线索化二叉树的实现" 在计算机科学中,二叉树是一种重要的数据结构,它广泛应用于各种领域,如数据库、文件系统、编译器等。线索化二叉树是一种特殊的二叉树,它在二叉树的每个节点中添加了指向其前驱和后继节点的...

    二叉树的具体实现例子

    二叉树是一种重要的数据结构...总结起来,二叉树是Java编程中一个重要的数据结构,理解和掌握其原理及实现方式对于提升编程能力至关重要。通过分析和实践,你可以深入理解二叉树的特性,并将其应用到实际问题的解决中。

    二叉树实现源代码 经典版

    二叉树实现源代码 经典版c++源码 *建立二叉树算法描述: 用ch扫描采用括号表示法表示二叉树的字符串Str。分以下几种情况: 1、若ch='('则将前面刚创建的结点作为双亲结点进栈,并置k=1,表示其后创建的结点将做为这...

    java 二叉树实现

    java二叉树实现 (简单实现,入门用) /**创建二叉树*/ public BinaryTree createTree(String treeStr); /**寻找结点*/ public BinaryTree findNode(BinaryTree tree ,char sign); /**找所给结点的左子树*/ ...

    C++线索二叉树类实现

    在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树的原理和C++实现。 首先,我们要明确二叉树的基本概念。二叉树是由n(n&gt;=0)个有限节点组成的数据结构,这些节点通过边...

    二叉树实现代码

    这个集合或者为空(称为空二叉树),或者由一个根节点及两个不相交的、分别称为左子树和右子树的二叉树组成。二叉树的深度是树中最大路径长度,而节点数决定了树的大小。 **2. 主要类型** - 完全二叉树:除最后一层...

    二叉树实现

    在这个“二叉树实现”项目中,我们主要关注的是利用二叉树来实现排序以及展示其节点遍历。 首先,`Tree.cpp`文件可能包含了二叉树类的实现。在C++中,一个二叉树的节点通常会定义为包含数据、指向左子节点和右子...

    数据结构实验——二叉树的建立和遍历.zip

    2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问结点的操作修改为叶结点计数,统计度为0的;度为1...

    二叉树建立 二叉树基本算法的实现

    (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。 (8...

    山东大学数据结构课设二叉树实现及分析

    山东大学数据结构课设二叉树实现及分析

Global site tag (gtag.js) - Google Analytics