1.递归
今天要处理树tree,在获取树的结构时候,常用方法就是递归。
1.1.什么是递归
递归(Recursion)是一种在函数定义中使用的编程概念,指的是在函数的定义中调用函数自身的过程。递归函数可以解决一些需要反复进行相同操作的问题,通常用于树形数据结构、数列、排序等问题中。
在递归函数中,通常会有两个条件:基本情况(base case)和递归情况(recursive case)。基本情况是指不需要进行递归,可以直接返回结果的情况;递归情况则是需要继续调用函数自身的情况。通过不断地将问题分解为更小的子问题,直到达到基本情况,递归函数可以实现问题的逐步求解。
需要注意的是,递归函数需要有一个终止条件,否则会无限递归下去,导致程序崩溃。
1.2递归实现
主要通过函数、方法自己调用自己实现。
1.树节点定义
public class Node implements Serializable {
@ApiModelProperty(value = "节点id", required = false)
private String item_id;
@ApiModelProperty(value = "父节点id", required = false)
private String item_pid;
@ApiModelProperty(value = "是否选中", required = false)
private Boolean checked;
@ApiModelProperty(value = "子节点", required = false)
private List<Node> children;
}
2.递归实现获取选中节点
public static void main(String[] args) throws Exception {
List<Node> selNodes = new ArrayList<Node>();
List<Node> nodes= new ArrayList<Node>();//所有树节点集合;
selNodes = getCheckNodes(nodes);//获取被选中的节点
}
public List<Node> getCheckNodes(List<Node> nodes){
Boolean checked = false;
List<Node> checkedNodes = new ArrayList<Node>();
List<Node> chileCheckedNodes = new ArrayList<Node>();
List<Node> childNodes = new ArrayList<Node>();
for( Node node:nodes){
checked = node.getChecked();
if(checked != null && checked){
checkedNodes.add(node);
childNodes = node.getChildren();
if(childNodes!=null && childNodes.size()>0){
chileCheckedNodes =getCheckNodes(childNodes);//递归,调用本方法
for(node childNode:chileCheckedNodes){
checkedNodes.add(childNode);
}
}
}
}
return checkedNodes;
}