`

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++实现

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

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

    平衡二叉树实现代码

    平衡二叉树实现代码

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

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

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

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

    二叉树实现源代码 经典版

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

    java 二叉树实现

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

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

    资源是txt版本,整合了思路及程序。内容仅供参考,不可用于商业,否则后果自负。

    PHP实现二叉树图

    PHP实现二叉树图

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

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

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

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

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

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

    二叉树类 及 实现

    二叉树类 创建 遍历 查找 等 功能

    用二叉树实现简单计算器

    用二叉树实现简单计算器

    二叉树的java实现

    二叉树的java实现

    二叉树实现以及相关算法

    cout****** 二叉树二叉链表结构测试程序 ******"; cout* 0--退出 *"; cout* 1--交互创建二叉树 *"; cout* 2--文件创建二叉树 *"; cout* 3--完全二叉树序列创建二叉树 *"; cout* 4--打印二叉树 *"; cout* 5--...

    汇编语言小程序二叉树实现

    汇编语言小程序二叉树实现汇编语言小程序二叉树实现汇编语言小程序二叉树实现汇编语言小程序二叉树实现汇编语言小程序二叉树实现汇编语言小程序二叉树实现汇编语言小程序二叉树实现汇编语言小程序二叉树实现汇编语言...

    二叉树操作 C++实现

    二叉树操作C++实现 二叉树操作C++实现 二叉树操作C++实现 二叉树操作C++实现 二叉树操作C++实现

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

    利用平衡二叉树的调平衡操作,实现学生成绩的输入,存储和读取,涉及平衡二叉树,文件等操作,实现学生成绩的基本管理

    C++ 二叉树 实现便利操作

    用递归的方法实现: 1、创建二叉树 2、先序遍历输出 3、后序遍历输出 4、中序遍历输出 5、二叉树深度

Global site tag (gtag.js) - Google Analytics