怎样把一个多叉树转化成类的形式

受邀。照例感谢 @Edwin 先。但老实说这个题目让我看得莫名其妙。我想就如今这个状态下我是给不出代码的。咱们还是先讨论下需求,作为一个不算答案的答案吧。首先,树是数据结构,类是代码实现,我实在不理解把“数据结构”转化为“类”是什么意思。第二,按照楼主自己的说法,别人似乎已经写好了代码了,类结构写好了,而且也显然也满足树的结构,连数据都有了,那为什么又要转换?转换什么?是要丢开别人的代码另写一套么?还是说已有的代码里没有函数实现不知道怎么第三,能不能解释一下什么是“方便的用”?是要遍历这个树结构么?还是要查询?需要提供的操作是什么?按名搜索还是遍历还是要修正某些数据?操作的时间复杂度和空间复杂度上有没有要求?==== 立此存照,等需求明确了咱再回答 ===还是老程一针见血,感谢@程劭非。好吧现在明白了,这不是转换而是一个ORM的问题。这里的需求是把一个树结构存进数据库,并且能够把这个结构还原成树结构。从实现上看这里有两个问题:怎么把树存进数据库。怎么把数据库里的表重新恢复成树。首先我不知道你的数据库用的是什么,我猜是SQL。我没用过SQL(做内核的不用也不需要这个),所以只能拿书本知识考虑。如果谈SQL,那就没有类结构而是表结构了,而讲表结构就没有树这一说。这种情况下如果不考虑查询性能,最简单的方案就是建九张表:前五张表每张存一层人员的信息,后四张表每张存相邻两层的对应关系。例如:Table 1: CorporationColumns: Corporation_Unique_ID Data1 Data2. ...Table 2: CompanyColumns: Company_Unique_ID Data1 Data2 ...Table 6: Corporation_Company_MapColumns: Corporation_Unique_ID Company_Unique_ID实际使用中如果所有数据库要保存的项目(公司、子公司、部门、小组)能统一设计ID,我们可以进一步简化为五张表,前四张存储公司、子公司、部门、小组的对应信息(没有集团是因为集团只会有一个),最后一张表统一存储各级ID的对应关系。需要查询单个项目的有关信息(比如小组的人数成员)时只需要查询一次表。如果查询隶属关系的话则需要查询三次表即可。同样地,如果要从中恢复类结构时只需要遍历表即可。具体地说两步:遍历公司、子公司、部门、小组表构造所有的对象。遍历map表,根据对象的隶属关系把每一个下属类对象(小组)加入上一级对象(比如部门)中去。=== 再次更新 ===再次更新。经过更多地讨论确认楼主的问题并不是ORM而是单纯的C++程序设计问题。进一步的分析请参考@程劭非 答案的评论部分。
■网友
感谢邀请。我觉得你首先要弄明白的是具体的业务需求,我不清楚你想要做什么。树的实现网上确实有一堆的例子,但是集团,子公司,部门,小组这几个业务对象实际上是从属关系,一对多的关系,普通的关系数据库表就可以表示了。“树”这种数据结构在关系数据库自身的实现中才有意义。 ----更新1-----好吧,弄清楚了一点来龙去脉。我的习惯不是上来就考虑写代码,而是去尽力搞清楚真正的需求。抛开这种做法的合理性不谈,假设你的客户就是要这么做,需求是:把一组有一对多的关系的业务对象从数据库加载进内存,表示为一个或者多个类。并且类结构已经被你的客户定义好了。而你需要将这组数据存入数据库中。不知道我理解得是否到位。基于上面的假设,下面谈谈我的思路。首先,不要一开始就想到树这种数据结构,只是用单纯的类就可以很清楚的表示集团、子公司、部门和小组这种业务模型。例如:class Group { vector\u0026lt;Company*\u0026gt; companies;}class Company { vector\u0026lt;Department *\u0026gt; departments;}class Department { vector\u0026lt;Team *\u0026gt; teams;} 将用户提供的数据结构(如你提到的Tree这个类)转换成上述模型。便可以容易的存入关系数据库中,也很容易的转换成给你的客户使用的那个Tree结构。我的建议是,不要把问题人为的复杂化,首先使用最简单,最直接的办法解决问题。或许没有使用所谓的多叉树这种比较“炫”的数据结构,较高程度的抽象,但是这种思路写出的代码是最容易维护,也最容易扩展的和重构的。如果真的需要用到“树”这种比较复杂的数据结构,我推荐使用Boost.Graph库。Keep It Simple and Stupid ---更新2-----抱歉,我似乎没有看清楚问题。可能是问题中提到的Tree结构不能够很清晰表达这种一对多的关系。建议使用Web Service接口或者XML文档来表达这种关系更合适。如果由于客户原因无法使用Web Service,那就根据Tree的结构转换吧。问题中Tree的结构描述比较简单,至少应该加一个type字段,表示当前这个Tree实例是“集团“,“公司”,“部门”还是小组。


推荐阅读