图论 - 寻找子图

时间:2012-10-23 23:39:12

标签: java graph graph-theory

我正在编写一个程序,它接受一些名称输入并查看以下结构的树:

                                                        John
                                                    /           \
                                                  Chris         Bob
                                                /   |   \        |  \
                                               Tom Ben  Anna    Jade  Ed
                                               /  \      |           /  \
                                            Will  Mark  Ant        Andy  Dan

程序应该返回子节点,其中根节点是输入名称之间的最低关系/链接。

如果我输入Mark和Ant,程序应返回以下树:

                                                  Chris 
                                                /       \   
                                               Tom     Anna     
                                                  \      |         
                                                  Mark  Ant 

如果我输入Will,Mark和Andy,程序应返回以下树:

                                                        John
                                                    /           \
                                                  Chris         Bob
                                                /                   \
                                               Tom                   Ed
                                               /  \                  /  
                                            Will  Mark             Andy  

我正在为树节点和连接使用以下类:

import java.util.ArrayList;
import java.util.List;

public class Person {
    private String name; 
    private List<Person> children;

    public Person(String name) { 
        this.name = name; 
        children = new ArrayList<Person>();
    }

    public String getName() {
        return name;
    }
    public List<Person> getChildren() {
        return children;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setChildren(List<Person> children) {
        this.children = children;
    }
    public void addChild(Person c) { 
        children.add(c);
    }
}

我的问题是如何解决确定公共节点的问题(在第一个例子中它是Chris,第二个是它的John)以及如何使用该名称来获取子树(下面的公共节点和节点)

我也在考虑扩展这个以使用Neo4j数据库,但我想先在这种情况下解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在寻找的是共同的最低祖先:

http://en.wikipedia.org/wiki/Lowest_common_ancestor

我可以尝试详细解释它,但我永远不会比本教程更好更全面地做到这一点,本教程教你一些不同的算法来解决这个问题:

http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor