Need help with this XML code

This code gets all the words in in the xml and arranges them in order… Copy it into a frame and see for yourself… I’m not too sure what the functions are doing though can someone please explain?

var xml:XML = new XML(<xml>
<starter value="There once was a">
	<right value="dog that">
		<right value="bit the mailman">
			<right value="that he">
				<right value="ran away"/>
				<left value="cried"/>
			</right>			
		</right>
		<left value="had no owner"></left>
	</right>
	<left value="man called">
		<left value="Bob">
			<left value="who thought a lot"/>
		</left>
		<right value="tom who liked">
			<right value="actionscript"/>
			<left value="to flirt with">
				<right value="loose women"/>
				<left value="complete strangers"/>
			</left>
		</right>
	</left>
</starter>
</xml>);

var sx:int = 0;
var sy:int = 200;


traverse(xml.starter, sx, sy, 0);

function traverse(node:XMLList, sx:int, sy:int, ri:int) {
	
	var o:* = drawNode(node.@value, sx, sy, ri);
	sx = o.x;
	sy = o.y;
	var paths:int = 0;
	
	if (node.left.length() == 1) {
		traverse(node.left, sx, sy-7, ri-22.5);
		paths++;
	}
	if (node.right.length() == 1) {
		traverse(node.right, sx, sy+7, ri+22.5);
		paths++;
	}

}


function drawNode(t:String, x:int, y:int, r:int):* {
	var font:Verdana8pt = new Verdana8pt();
    var format:TextFormat	      = new TextFormat();
    format.font		      		= font.fontName;
    format.color                = 0x000000;
    format.size                 = 8;
				
    var label:TextField         = new TextField();
    label.embedFonts            = true;
    label.autoSize              = TextFieldAutoSize.LEFT;
    label.antiAliasType         = AntiAliasType.ADVANCED;
    label.defaultTextFormat     = format;
    label.text                  = t;
	var nr:Number = (r+label.rotation) * (Math.PI/180);
	var nx:Number = x + ((label.width + 5) * Math.cos(nr) );
	var ny:Number = y + 7 + ((label.width + 5)* Math.sin(nr) );
	label.rotation 				+= r;
	label.x						= x;
	label.y						= y;
	addChild(label);	
	
	return {x:nx, y:ny, r:nr};	
}