mysql查询父子关系树_根据数据的父子关系创建树形结构并实现遍历

本文介绍如何在MySQL环境下,根据数据的父子关系创建树形结构,并利用Java实现树的广度优先和深度优先遍历。通过定义结点接口、工具类以及结点示例,详细展示了构建和遍历树的过程。
摘要由CSDN通过智能技术生成

在实际开发中,有一种数据是类型,它存在父子关系,比如京东商城中,商品的分类有家用电器和服饰鞋帽,家用电器下边有大家电和家用电子,然后他们下边还有子类。而且这类父子关系有时深度是不确定的,本文用下面的方法,将所有类似分类的结点创建成一棵树并遍历打印他们。

1.结点要实现下面的接口:

package subAndsup;

import java.util.List;

/**

* add by ak on 2013-11-28

*/

public  interface InheritedNode {

 boolean isChildFrom(T node);

 boolean isBrother(T node);

 void addChildNode(T node);

 List getChildNodes();

}

package subAndsup;

import java.util.List;

/**

* add by ak on 2013-11-28

*/

public  interface InheritedNode {

boolean isChildFrom(T node);

boolean isBrother(T node);

void addChildNode(T node);

List getChildNodes();

}

2.工具类如下:

package subAndsup;

import java.util.ArrayDeque;

import java.util.ArrayList;

import java.util.Deque;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

/**

* add by ak on 2013-11-28

*/

public class TreeUtil {

/**

* 将无序的结点集合,创建成一棵树。

* 创建过程中使用了树的广度优先遍历,并且在考察无序集合的元素时,

* 将其逐个插入到广度优先遍历结果集中,最后得到的结果集即是广度优先

* 遍历的结果,也是从根元素(结果集中第一个元素)串联好的树形结构。

* @param root 根元素

* @param allCategory 无序的、不含根元素的集合

* @return 包含子类的树形结构的根元素

*/

public static  T getTree(T root, LinkedList list) {

// 模拟树的广度遍历结果的集合

LinkedList traversalList = new LinkedList();

traversalList.push(root);

// 原始集合不为空,则继续迭代,将其中的元素加入到树的广度遍历结果集合中

while(list.size() != 0) {

// 迭代原始集合中的元素

Iterator iterAll = list.iterator();

while(iterAll.hasNext()) {

T ndInAll = iterAll.next();

// 迭代树的广度遍历结果集合中的元素

Iterator iterTrav = traversalList.iterator();

int indInTrav = 0;// 记录迭代当前元素的位置

boolean mate = false;// 标识是否找到父子类匹配关系

while(iterTrav.hasNext()) {

T ndInTrav = iterTrav.next();

// 如果存在父子类关系,则在在树的广度遍历结果集合中添加该元素,并父类中加入子元素

if(!mate) {

if(ndInAll.isChildFrom(ndInTrav)) {

// 如果存在父子类关系,则在父类中加入子元素,并设置标识

ndInTrav.addChildNode(ndInAll);

mate = true;

}

} else {

// 在找到iterInAll元素的父类之后,继续迭代,找到它的兄弟结点的位置

if(ndInAll.isBrother(ndInTrav)) {

break;

}

}

indInTrav++; // 执行++之后为迭代当前元素的位置

}

if(mate) {

// 如果找到iterInAll元素的父类,则在它的兄弟结点之前插入该元素

traversalList.add(indInTrav, ndInAll);

// 移除已经匹配的元素

iterAll.remove();

}

}

}

// 最后将所有元素已经放到了树的广度遍历结果集合中,并且元素之间建立好了子父关系,即只取根就可得到所有元素

T root2 = traversalList.getFirst();

return root2;

}

/**

* 通过树的深度优先遍历获取树的遍历集合

* @param root 树的根元素

* @return 深度优先遍历方式的遍历集合

*/

public static  List createDepthFirstTraversalList(T root) {

List depthFirstTraversalList = new ArrayList();

// 深度优先遍历使用的栈结构

Deque stack = new ArrayDeque();

stack.ad

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值