我知道如何开始构建一个heirachial树吗?该树传递一个employeeID和一个managerID。节点之间的链接意味着一种关系 - 树中较高的节点是较低节点的管理器。但是,我们希望树上的操作是有效的,例如搜索应该是O(lg n)。有任何想法吗?这甚至可能吗?
修改
我真的需要帮助。我可能会问为什么这个问题被关闭了?
答案 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个属性的对象:
多数民众赞成
如果你总是从“大老板”开始并做一个自上而下的搜索,你甚至可以在没有与经理的关系的情况下意识到这一点答案 2 :(得分:0)
嗯,对于任何树,我觉得你应该将节点视为相等,因为任何节点都可以包含子节点(包括子节点)。考虑到这一点,对于大多数树木,我倾向于采取父母 - &gt;儿童方法,例如:
用户表:
ID ParentID Name
1 0 Joe
2 0 Sally
3 2 Jim
现在,在这张桌子中,Joe&amp; Sally是根级别,而Jim是Sally的孩子(在这种情况下是雇员)。这可以继续,其他用户是用户的孩子,甚至他们自己也是其他人的孩子......等等。
这种方法的好处是,您可以在树控件的眼中使所有用户都相等。您不需要为每个特定级别定制对象集合,也不需要用于确定用户类型并将其注入正确节点的复杂逻辑。如果你必须手动对它们进行排序,你需要的只是一个简单的递归函数,根据它们的ID检查子项的父项(在本例中以0为根)。
至于实际实现,至少在ASP.NET中,我建议使用TreeView,HierarchicalDataSourceControl和HierarchicalDataSourceView。通过这三个对象,您可以相对快速地实现数据树,并且使用的模式非常通用,因此您可以对其进行调整以使用未来的数据对象。