实现分层树

时间:2011-10-14 22:02:47

标签: algorithm

我知道如何开始构建一个heirachial树吗?该树传递一个employeeID和一个managerID。节点之间的链接意味着一种关系 - 树中较高的节点是较低节点的管理器。但是,我们希望树上的操作是有效的,例如搜索应该是O(lg n)。有任何想法吗?这甚至可能吗?

修改

我真的需要帮助。我可能会问为什么这个问题被关闭了?

3 个答案:

答案 0 :(得分:2)

我会有一棵树来管理关系,同时维护一张地图以跟踪节点本身。

请注意,我没有实施招聘,解雇或推广方法。它们非常简单,有点超出了基本结构的范围(它们可以从下面的代码中自我解释。如果它们不立即跳出来,那么你需要研究它是如何工作的更多一点为了你自己!)

class OrgChart {

    // Assume these are properly constructed, etc...
    static class Employee {
        String name;
        EmployeeID id;
        Employee manager;
        Set<Employee> underlings;
    }

    static class EmployeeID {
        // what is the id? id number? division  + badge number?
        // doesn't matter, as long as it has hashCode() and equals()
    }

    Map<EmployeeID, Employee> employeesById = new HashMap...

    Employee ceo = new CEO.getTheCEO();

    public Employee getManagerfor(EmployeeID id) {
        Employee dilbert = employeesById.get(id);
        return dilbert.manager;
    }

    public Set<Employees> getEmployeesUnder(EmployeeID phbid) {
        Employee phb = employeesbyId.get(phbid);
        return phb.underlings;
    }

}

答案 1 :(得分:0)

您创建一个包含2个属性的对象:

  • 经理(层级化)
  • 员工(分层向下) - &gt;是一个集合

多数民众赞成

如果你总是从“大老板”开始并做一个自上而下的搜索,你甚至可以在没有与经理的关系的情况下意识到这一点

答案 2 :(得分:0)

嗯,对于任何树,我觉得你应该将节点视为相等,因为任何节点都可以包含子节点(包括子节点)。考虑到这一点,对于大多数树木,我倾向于采取父母 - &gt;儿童方法,例如:

用户表:

ID    ParentID    Name
1      0          Joe
2      0          Sally
3      2          Jim

现在,在这张桌子中,Joe&amp; Sally是根级别,而Jim是Sally的孩子(在这种情况下是雇员)。这可以继续,其他用户是用户的孩子,甚至他们自己也是其他人的孩子......等等。

这种方法的好处是,您可以在树控件的眼中使所有用户都相等。您不需要为每个特定级别定制对象集合,也不需要用于确定用户类型并将其注入正确节点的复杂逻辑。如果你必须手动对它们进行排序,你需要的只是一个简单的递归函数,根据它们的ID检查子项的父项(在本例中以0为根)。

至于实际实现,至少在ASP.NET中,我建议使用TreeViewHierarchicalDataSourceControlHierarchicalDataSourceView。通过这三个对象,您可以相对快速地实现数据树,并且使用的模式非常通用,因此您可以对其进行调整以使用未来的数据对象。