public function traverseDeepth( $source, $queue = array(), $hadNodes = false )
	{
		$nextnodeSet = array();
		if( !$hadNodes) $hadNodes = array();
		$hadNodes[] = $source->getNodeName();
		array_push($queue, $source );
		foreach( $this->getSourceNodes( $source) as $node )
		{
			if( !in_array( $node->getNodeName(), $hadNodes ) )
			{
				$hadNodes[] = $node->getNodeName();
				$nextnodeSet[] = $node;
			}
		}
		foreach( $this->getTargetNodes( $source) as $node )
		{
			if( !in_array( $node->getNodeName(), $hadNodes ) )
			{
				$hadNodes[] = $node->getNodeName();
				$queue = $this->traverseDeepth( $node, $queue, $hadNodes );
			}
		}
		foreach( $nextnodeSet as $node )
		{
			$queue = $this->traverseDeepth( $node, $queue, $hadNodes );
		}
		return $queue;
	}