原创误删,写了个N叉树,格式输出了下二叉树,抛砖引玉而已, 求各种实现方式

package org.benson.dto;

import java.util.ArrayList;
import java.util.List;

/**
 * @author BenSon He
 * @email qing878@gmail.com ,qq 107966750
 * @since 19/21/2012
 */
public class Node {
	List<Node> list = new ArrayList<Node>();;
	private int value;
	private int level;

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public Node getNodeByIndex(int index) {
		return list.get(index);
	}

	public void addNode(Node node) {
		list.add(node);
	}

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}

	public int getSize() {
		return list.size();
	}

}

  

package org.benson.util;

import org.benson.dto.Node;
/**
 * @author BenSon He
 * @email qing878@gmail.com ,qq 107966750
 * @since 19/21/2012
 */
public class XTreeUtil {
	static int index;
	static String toStrArray[][];

	public static void getXTree(Node node, int level, int nx) {
		level--;
		index = node.getValue();
		for (int i = 0; i <= nx; i++) {
			// index=index+1;
			// System.out.println(index);
			Node chirdNode = new Node();
			chirdNode.setValue(++index);
			node.addNode(chirdNode);
			node.setLevel(level);
			if (level > 0)
				getXTree(chirdNode, level, nx);
		}
	}

	/**
	 * get node by level and index
	 * 
	 * @param node
	 *            , start of node
	 * @param level
	 * @param index
	 *            , the index of chirdNode
	 * @return
	 */
	public static Node getNode(Node node, int level, int index) {
		level--;
		if (level > 0)
			return getNode(node.getNodeByIndex(index), level, index);
		else
			return node.getNodeByIndex(index);
	}

	public static void displayTree(Node node, int level, int nx) {
		int indexLenth = getNode(node, level, nx).getValue() + 1;
		toStrArray = new String[level+1][indexLenth];
		// init array
		for (int i = 0; i < toStrArray.length; i++) {
			for (int j = 0; j < toStrArray[i].length; j++) {
				toStrArray[i][j]=" ";
			}
		}
		toStrArray[level][toStrArray[0].length/2]=String.valueOf(node.getValue());
		fillTree(node, level, toStrArray[0].length/2);
		for (int i = 0; i < toStrArray.length; i++) {
			for (int j = 0; j < toStrArray[i].length; j++) {
				System.out.print(toStrArray[i][j]);
			}
			System.out.println();
		}
		System.out.println();
	}
	public static void fillTree(Node node,int level,int index){
		level--;
		int spaceCount=(int) Math.pow(2, level);
		Node leftNode=node.getNodeByIndex(0);
		toStrArray[level][index+spaceCount]=String.valueOf(leftNode.getValue());
		Node rightNode=node.getNodeByIndex(1);
		toStrArray[level][index-spaceCount]=String.valueOf(rightNode.getValue());
		if(level>0){
			fillTree(leftNode, level, index+spaceCount);
			fillTree(rightNode, level, index-spaceCount);
			}
		
	}

	public static void main(String[] args) {
		Node node = new Node();
		int level=4;
		int nIndex=1; // start with 0. 1 is 2 leaf
		node.setValue(1);// start value . root value
		XTreeUtil.getXTree(node, level, nIndex); // level and index .the level start element index is 0
		displayTree(node,level, nIndex);
	}
}

输出如下

 31 30 28 27 24 23 21 20 16 15 13 12 9 8 6 5
  29   26   22   19   14   11   7   4 
    25       18       10       3   
        17               2       
                1               

  

可以改变nIndex实现N叉树结构

nIndex=1  二叉

nIndex= 2  三叉

只做了二叉的格式化输出,但是N叉格式化输出就没做了,觉得还是有点麻烦

 

写着玩而已,没去查其他实现,或许有BUG,求指出。

不喜勿喷

如果有兴趣贴上各种实现方式

 

 

类似应用,比如生成XML的递归 也不错

当然,递归在时间和空间上都不怎么好

View Code
package org.benson.another;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author BensonHe QQ277803242
 * 
 *         TODO manage node and value.and format the node to xml file
 * 
 */
public class XMLSimpleNode implements SimpleNode {
    private String nodeName;
    private String value;
    List<SimpleNode> childs;
    private String header;

    public XMLSimpleNode(String nodeName) {
        this.nodeName = nodeName;
        childs = new ArrayList<SimpleNode>(2);
    }

    public String getNodeName() {
        return nodeName;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.benson.another.SimpleXMLFileUtil#setNodeName(java.lang.String)
     */
    public void setNodeName(String nodeName) {
        this.nodeName = nodeName;
    }

    public String getValue() {
        return value;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.benson.another.SimpleXMLFileUtil#setValue(java.lang.String)
     */
    public void setValue(String value) {
        this.value = value;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.benson.another.SimpleXMLFileUtil#addChild(org.benson.another.XMLItem)
     */
    public void addChild(SimpleNode node) {
        childs.add(node);
    }

    public String startTag() {
        StringBuffer tagSart = new StringBuffer("<");
        tagSart.append(nodeName);
        tagSart.append(">");
        return tagSart.toString();
    }

    public String endTag() {
        StringBuffer tagEnd = new StringBuffer("</");
        tagEnd.append(nodeName);
        tagEnd.append(">");
        return tagEnd.toString();
    }

    public String getHeader() {
        return header;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.benson.another.SimpleXMLFileUtil#setHeader(java.lang.String)
     */
    public void setHeader(String header) {
        this.header = header;
    }

    /**
     * ToDo format the node to xml file
     */
    public String formartXMLFile() {
        StringBuffer xmlFileBf = new StringBuffer();
        xmlFileBf.append(this.getHeader());
        return this.getNode(this, xmlFileBf).toString();
    }

    /**
     * 
     * @param node
     * @param xmlFileBf
     * @return get XML content by node
     */
    private StringBuffer getNode(SimpleNode node, StringBuffer xmlFileBf) {
        XMLSimpleNode xmlNode = (XMLSimpleNode) node;
        XMLSimpleNode xmlNodeItem = null;
        xmlFileBf.append(xmlNode.startTag());
        if (xmlNode.childs.size() != 0) {
            for (int i = 0; i < xmlNode.childs.size(); i++) {
                xmlNodeItem = (XMLSimpleNode) xmlNode.childs.get(i);
                getNode(xmlNodeItem, xmlFileBf);
            }
        }
        if (xmlNode.getValue() != null)
            xmlFileBf.append(xmlNode.getValue());
        xmlFileBf.append(xmlNode.endTag());
        return xmlFileBf;
    }

    public static void main(String[] args) {
        SimpleNode xmlNode = new XMLSimpleNode("root");
        xmlNode.setHeader("<?xml version=\"1.0\" encoding=\"UTF-8\" ?> ");
        SimpleNode chridNode1 = new XMLSimpleNode("chrid1");
        SimpleNode chridNode2 = new XMLSimpleNode("chrid2");
        SimpleNode chridNode3 = new XMLSimpleNode("chrid3");
        SimpleNode chridNode11 = new XMLSimpleNode("chrid11");
        SimpleNode chridNode12 = new XMLSimpleNode("chrid12");
        SimpleNode chridNode13 = new XMLSimpleNode("chrid13");
        chridNode11.setValue("chridNode11 Value");
        chridNode12.setValue("chridNode12 Value");
        chridNode13.setValue("chridNode13 Value");
        chridNode2.setValue("chridNode2 Value");
        chridNode3.setValue("chridNode3 value");
        chridNode1.addChild(chridNode11);
        chridNode1.addChild(chridNode12);
        chridNode1.addChild(chridNode13);
        xmlNode.addChild(chridNode1);
        xmlNode.addChild(chridNode2);
        xmlNode.addChild(chridNode3);
        System.out.println(xmlNode.formartXMLFile());
    }


}

输出效果如下

<?xml version="1.0" encoding="UTF-8" ?> <root><chrid1><chrid11>chridNode11 Value</chrid11><chrid12>chridNode12 Value</chrid12><chrid13>chridNode13 Value</chrid13></chrid1><chrid2></chrid2><chrid3></chrid3></root>

 

posted @ 2012-11-21 18:33  何锦彬  阅读(943)  评论(1编辑  收藏  举报