求Java List 递归算法..
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求Java List 递归算法..相关的知识,希望对你有一定的参考价值。
求Java List 递归 算法:
通过方法取得的List(myList)结构如下:
id name parentId
1 AA null
2 BB 1
3 CC 1
4 DD 2
5 EE 2
6 FF 4
想要一个递归方法,以myList为参数,最后返回一个List,能够输出如下树的结构:
AA
--BB
----DD
------FF
----EE
--CC
FormBean:
String id;
String name;
String parentId;
从设计角度看,表结构设计已经有问题了!
即使是树状结构,为何表结构没有体现?这也构成了为何楼主需要想办法来应对非树状结构数据的树状显示问题。
先进一步来说,表加一个grade字段,来表明当前记录处于第几级。那么直接一个SQL就可以取出来:
select lpad(' ',a.grade,'-')||a.name from myList a
这样就可以按楼主需要的结构取出数据;
但还存在一个问题,就是顺序问题,这样取出的数据是无序的!
那么我们再进一步看,我在做这种数据结构的表设计时,往往会给每个结点增加两个字段,left/right,分别代表其在树中的左右值。
这样就可以在上面SQL后增加order by a.left以保证取出数据的顺序。 参考技术A //应该就是这样了
import java.util.ArrayList;
import java.util.List;
public class TreeList
public TreeList()
public static List<Object> beansToList(Object[] objs)
List<Object> list = new ArrayList<Object>();
for (Object obj : objs)
list.add(obj);
return list;
public static BinTree listToTree(List<?> list)
BinTree tree = new BinTree();
for (Object obj : list)
tree.insert(((FormBean) obj).getParentId(), obj);
return tree;
public static void main(String[] args)
FormBean[] beans = new FormBean[] new FormBean("1", "AA", null),
new FormBean("2", "BB", "1"), new FormBean("3", "CC", "1"),
new FormBean("4", "DD", "2"), new FormBean("5", "EE", "2"),
new FormBean("6", "FF", "4"), ;
List<Object> list = TreeList.beansToList(beans);
BinTree tree = TreeList.listToTree(list);
for (Object o : list)
System.out.println(o);
System.out.println("递归遍历之后的List输出..");
List<Object> res = new ArrayList<Object>();
//递归前序遍历树,顺序保存formbean到res中
tree.preList(tree.root, res);
//输出最后结果,和你的一样吧 ,呵呵
for (Object o : res)
System.out.println(o);
/*
AA
-BB
--DD
----FF
--EE
-CC
*/
class FormBean
private String id;
private String name;
private String parentId;
public String toString()
int len = this.getParentId() == null ? 0 : Integer.parseInt(this
.getParentId());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++)
sb.append("-");
return sb.append(this.getName()).toString();
public FormBean(String id, String name, String parentId)
super();
this.id = id;
this.name = name;
this.parentId = parentId;
public FormBean()
public String getId()
return id;
public void setId(String id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getParentId()
return parentId;
public void setParentId(String parentId)
this.parentId = parentId;
class BinTree
public void preList(Node node, List<Object> list)
if (node != null)
list.add(node.face);
preList(node.leftChild, list);
preList(node.rightChild, list);
public Node root;
public BinTree()
root = null;
public void insert(String value, Object face)
value = value == null ? "0" : value;
this.insert(Long.parseLong(value), face);
public void insert(long value, Object face)
Node newNode = new Node(value, face);
if (root == null)
root = newNode;
else
Node current = root;
Node parentNode;
while (true)
parentNode = current;
if (value > current.value)
current = current.leftChild;
if (current == null)
parentNode.leftChild = newNode;
return;
else
current = current.rightChild;
if (current == null)
parentNode.rightChild = newNode;
return;
class Node
public long value;
public Object face;
public Node leftChild;
public Node rightChild;
public Node(long value)
this.value = value;
face = null;
leftChild = null;
rightChild = null;
public Node(long value, Object face)
this.value = value;
this.face = face;
face = null;
leftChild = null;
rightChild = null;
参考技术B //-----Demo.java
import java.util.ArrayList;
import java.util.List;
public class Demo
//-----------------------方法
public List orderlist(List mylist)
List list1=new ArrayList();
List list2=new ArrayList();
String be1="";
String be2="";
list1.add(((Beans)mylist.get(0)).getName());
for(int i=1;i<mylist.size();i++)
if(((Beans)mylist.get(i)).getParentId().equals(((Beans)mylist.get(i-1)).getParentId()))
be1=be1+"--";
list2.add(be1+((Beans)mylist.get(i)).getName());
else
be2=be2+"--";
list1.add(be2+((Beans)mylist.get(i)).getName());
for(int k=list2.size()-1;k>=0;k--)
list1.add(list2.get(k));
//输出结果
for(int m=0;m<list1.size();m++)
System.out.println(list1.get(m));
return list1;
//-------------------------main方法调用 Demo是类名
public static void main(String[] args) throws Exception
Demo demo=new Demo();
List list=new ArrayList();
Beans b=null;
//-
b=new Beans();
b.setId("1");
b.setName("AA");
b.setParentId(null);
list.add(b);
//--
b=new Beans();
b.setId("2");
b.setName("BB");
b.setParentId("1");
list.add(b);
//---
b=new Beans();
b.setId("3");
b.setName("CC");
b.setParentId("1");
list.add(b);
//----
b=new Beans();
b.setId("4");
b.setName("DD");
b.setParentId("2");
list.add(b);
//-----
b=new Beans();
b.setId("5");
b.setName("EE");
b.setParentId("2");
list.add(b);
//------
b=new Beans();
b.setId("6");
b.setName("FF");
b.setParentId("4");
list.add(b);
demo.orderlist(list);
//--Beans
public class Beans
String id;
String name;
String parentId;
public String getId()
return id;
public void setId(String id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getParentId()
return parentId;
public void setParentId(String parentId)
this.parentId = parentId;
参考技术C 很简单啊,这就是一个树的前序遍历算法。递归非递归都可以实现
java例题_22 用递归求阶乘 5!
1 /*22 【程序 22 递归求阶乘】
2 题目:利用递归方法求 5!。
3 程序分析:递归公式:fn!=fn*4!
4 */
5
6 /*分析
7 * 递归:如果其中每一步都要用到前一步或前几步的结果,称为递归的
8 * 根据提示,可以用算法x!=x*(x-1)!;y=x-1,y!=y*(y-1)!;...
9 *
10 * */
11
12
13 package homework;
14
15 public class _22 {
16
17 public static void main(String[] args) {
18 // TODO Auto-generated method stub
19 int x=5;
20 System.out.println(JieCheng(x));
21 }
22
23 public static int JieCheng(int x) { //必须用int类型,否者不能返回int
24 if(x==1) {
25 return 1; //限定递归的范围
26 }
27 else {
28 return x*(JieCheng(x-1));
29 }
30 }
31
32 }
以上是关于求Java List 递归算法..的主要内容,如果未能解决你的问题,请参考以下文章