经典算法之递归

本文介绍两种递归算法实现树结构的遍历,包括获取所有树节点的方法。通过递归调用,可以有效地收集树的每个节点,适用于多种树形数据结构处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以树这样一个经典的案例,通过递归算法,实现获取所有的树节点。

方法一:递归时,加入当前节点
	//获取所有的树节点
public List<XxxTree> getAllNodes(){
List<XxxTree> list = new ArrayList<XxxTree>();
List<XxxTree> rootList = getChildNodesById(0L);//获取根节点列表
for(XxxTree root : rootList){
doBuild(root, list);
}
return list;
}

//根据树节点id获取其所有直接子节点
private List<XxxTree> getChildNodesById(Long id){
String hql = "SELECT t FROM XxxTree t where t.uplink = ? ";
return xxxDao.find(hql, new Object[]{id});
}

//递归获取:该节点以及该节点以下的所有的子节点
private void doBuild(XxxTree obj, List<XxxTree> list){
list.add(obj); //加入当前节点
List<XxxTree> childList = getChildNodesById(obj.getIdx());
if(childList!=null && childList.size()>0){
for(XxxTree child : childList){
doBuild(child, list);
}
}
}

方法二:递归时,加入当前节点的子节点列表
	//获取所有的树节点
public List<XxxTree> getAllNodes(){
List<XxxTree> list = new ArrayList<XxxTree>();
List<XxxTree> rootList = getChildNodesById(0L);//获取根节点列表
list.addAll(rootList);
for(XxxTree root : rootList){
doBuild(root, list);
}
return list;
}

//根据树节点id获取其所有直接子节点
private List<XxxTree> getChildNodesById(Long id){
String hql = "SELECT t FROM XxxTree t where t.uplink = ? ";
return xxxDao.find(hql, new Object[]{id});
}

//递归获取:该节点以下的所有的子节点
private void doBuild(XxxTree obj, List<XxxTree> list){
List<XxxTree> childList = getChildNodesById(obj.getIdx());
if(childList!=null && childList.size()>0){
list.addAll(childList);//加入当前节点的子节点列表
for(XxxTree child : childList){
doBuild(child, list);
}
}
}

上面两种方法实现递归的模拟实现,见附件,可以直接运行!

附:
oracle中connect by prior递归算法,例如:
SELECT * FROM tree START WITH idx = 123 CONNECT BY PRIOR idx = uplink
查询:idx为123的节点 以及该节点下面的所有子节点(递归)
http://www.cnblogs.com/chen1388/archive/2010/09/25/1834827.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值