如问题所述,最好能有个全面点的答案,举个操作实例最好!感谢!
如果完美解决问题,我会追加奖励!
麻烦把问题描述清楚。有没有需求文档。
树分解,属于分解法(Decomposition Method)的一种,也被称为集团树,连接树和连接树,是将图形映射到相关树(Related Tree)的一种方法。它的主要特性是可以有效地计算原始图的某些属性(例如,独立多项式)。 图的树分解不是唯一的,也不需要与原始图同构。树分解常常与树的宽度(Treewidth,简称树宽)的概念联系在一起。在最佳树分解中,映射到任何树顶点的原始图顶点数被称为树宽。
1.对于每个顶点v∈V,存在节点i∈N使得v∈χ(i)。
2.对于每一条边(v,w)∈E,存在一个i∈N且v∈χ(i)且w∈χ(i)。
3.对于每个i,j,k∈N:如果j位于i和k之间的路径上,则χ(i)∩ χ(k)⊆ χ(j)。
树分解的宽度定义为maxi∈N| x(i)| -1,并且图的树宽是所有树分解中的最小宽度。
在AI和概率推理领域中,树分解又称为团树,可以用来提高推理效率,并且给约束满足问题(constraint satisfaction problem)和 NP-hard 问题提供了求解答案,提高了图论在AI方面的效率,比如优化了机器人寻路的方案。
1、准备表结构及对应的表数据
a、表结构:
create tableTB_TREE
(
CID NUMBER not null,
CNAME VARCHAR2(50),
PID NUMBER //父节点
)
b、表数据:
insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0);
insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1);
insert into tb_tree (CID, CNAME, PID) values (3, '广东省', 1);
insert into tb_tree (CID, CNAME, PID) values (4, '上海市', 1);
insert into tb_tree (CID, CNAME, PID) values (5, '广州市', 3);
insert into tb_tree (CID, CNAME, PID) values (6, '深圳市', 3);
insert into tb_tree (CID, CNAME, PID) values (7, '海珠区', 5);
insert into tb_tree (CID, CNAME, PID) values (8, '天河区', 5);
insert into tb_tree (CID, CNAME, PID) values (9, '福田区', 6);
insert into tb_tree (CID, CNAME, PID) values (10, '南山区', 6);
insert into tb_tree (CID, CNAME, PID) values (11, '密云县', 2);
insert into tb_tree (CID, CNAME, PID) values (12, '浦东', 4);
2、TreeNode对象,对应tb_tree
public class TreeNode implementsSerializable {
privateInteger cid;
privateString cname;
privateInteger pid;
private List nodes = newArrayList();
publicTreeNode() {
}
//getter、setter省略
}
3、测试数据
public classTreeNodeTest {
@Test
public void loadTree() throwsException{
System.out.println(JsonUtils.javaToJson(recursiveTree(1)));
}
/*** 递归算法解析成树形结构
*
* @paramcid
* @return* @authorjiqinlin
*/
public TreeNode recursiveTree(intcid) {
//根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?)
TreeNode node =personService.getreeNode(cid);
//查询cid下的所有子节点(SELECT * FROM tb_tree t WHERE t.pid=?)
List childTreeNodes =personService.queryTreeNode(cid);
//遍历子节点
for(TreeNode child : childTreeNodes){
TreeNode n = recursiveTree(child.getCid()); //递归
node.getNodes().add(n);
}
returnnode;
}
}
输出的json格式如下:
{
"cid": 1,
"nodes": [
{
"cid": 2,
"nodes": [
{
"cid": 11,
"nodes": [
],
"cname": "密云县",
"pid": 2}
],
"cname": "北京市",
"pid": 1},
{
"cid": 3,
"nodes": [
{
"cid": 5,
"nodes": [
{
"cid": 7,
"nodes": [
],
"cname": "海珠区",
"pid": 5},
{
"cid": 8,
"nodes": [
],
"cname": "天河区",
"pid": 5}
],
"cname": "广州市",
"pid": 3},
{
"cid": 6,
"nodes": [
{
"cid": 9,
"nodes": [
],
"cname": "福田区",
"pid": 6},
{
"cid": 10,
"nodes": [
],
"cname": "南山区",
"pid": 6}
],
"cname": "深圳市",
"pid": 3}
],
"cname": "广东省",
"pid": 1},
{
"cid": 4,
"nodes": [
{
"cid": 12,
"nodes": [
],
"cname": "浦东",
"pid": 4}
],
"cname": "上海市",
"pid": 1}
],
"cname": "中国",
"pid": 0}