日期:2014-05-20  浏览次数:20773 次

遍历表生成树列表
   最近正在搞遍历表,然后在前台生成动态的树,想用递归来实现,但是自己一直写不出,陷入了思维混乱状态,特此发帖,寻求帮助
   我想循环遍历下面这张表的内容
   

最终我想要
打印输出这样的结果:

一级子菜单
------一级子菜单1
------一级子菜单2
二级子菜单
------二级子菜单
-------------------二级下一级子菜单

请各位大侠不吝赐教!!!!
遍历表生成树列表

------解决方案--------------------
你的思维似乎有点混乱。
如果是Web项目的话,百度一下“hibernate自关联”,有很多代码供你参考,而且不用递归。
如果你想体现程序的思想,应该是普通树的先序遍历吧?
普通树的逻辑结构是这样的:

但在计算机内部的存储结构却是这样的:

所以很容易写出以下的代码:


import org.junit.Test;

/**
 * 普通树的节点
 *
 */
class TreeNode{

/**
 * 数据域
 */
private String data;

/**
 * 第一个孩子
 */
private TreeNode firstCh;

/**
 * 下一个兄弟
 */
private TreeNode nextSib;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}

public TreeNode getFirstCh() {
return firstCh;
}
public void setFirstCh(TreeNode firstCh) {
this.firstCh = firstCh;
}
public TreeNode getNextSib() {
return nextSib;
}
public void setNextSib(TreeNode nextSib) {
this.nextSib = nextSib;
}
public TreeNode(String data) {
super();
this.data = data;
}
public TreeNode(String data, TreeNode firstCh, TreeNode nextSib) {
super();
this.data = data;
this.firstCh = firstCh;
this.nextSib = nextSib;
}
public TreeNode() {
super();
}
@Override
public String toString() {
return "TreeNode [data=" + data + "]";
}


}
public class Tree {

/**
 * 静态数组  用于查表
 */
public static final String[] array={"--","----","------","--------","----------"};
public void outputTree(TreeNode root){
this.preOrder(root, 1);
}
/**
 *先序遍历一棵普通树
 *1、遍历p自身
 *2、递归遍历p的第一个孩子,层数+1
 *3、递归遍历p的下一个兄弟,层数不变
 */
public void preOrder(TreeNode node,int ceng){
if(node!=null){
System.out.println(array[ceng-1]+node.getData());
this.preOrder(node.getFirstCh(),ceng+1);
this.preOrder(node.getNextSib(), ceng);
}

}
@Test
public void test(){
TreeNode node1=new TreeNode("三级菜单3");
TreeNode node2=new TreeNode("三级菜单2");
node2.setNextSib(node1);
TreeNode node3=new TreeNode("三级菜单1");
node3.setNextSib(node2);
TreeNode node4=new TreeNode("二级菜单2");
TreeNode node5=new TreeNode("二级菜单1", node3, node4);
TreeNode node6=new TreeNode("一级菜单");
node6.setFirstCh(node5);
this.outputTree(node6);
}
}


其中,preOrder()函数是一个算法框架,你可以把:
System.out.println(array[ceng-1]+node.getData());改成你自己想要的业务逻辑。
------解决方案--------------------
数据不要一次性读取出来,动态的点击某个结点后,再读取出它的子结点。