我正在尝试开发一种算法,该算法可以读取包含一些数据的字典键列表。
读入应用程序的列表示例
ID: 1 Level: 0 Data:"Animal"
ID: 2 Level: 1 Data:"Dog"
ID: 3 Level: 1 Data:"Cat"
ID: 4 Level: 1 Data:"Sheep"
ID: 5 Level: 2 Data:"Collie"
ID: 6 Level: 2 Data:"Dalmation"
ID: 7 Level: 3 Data:"Tabby"
ID: 8 Level: 4 Data:"Suffolk"
ID: 9 Level: 5 Data:"Jimmy"
ID: 10 Level: 6 Data:"Sally"
现在,如果我想搜索" Sally"程序将通过树结构读取返回:
莎莉是一种类型达尔马的狗
这可以通过以下逻辑计算:
Animal
位于树的顶部,Dog
,Cat
和Sheep
构成了下一个级别。 然后将Level 2分配给Level 1的第一个元素,Level 3分配给Level 1的第二个元素,Level 4分配给Level 1的第三个元素。由于Level 1已经填写了I进入下一个级别;在这种情况下,级别2.级别2有2个元素,因此级别5应用于第一个元素,级别6应用于第二个元素,在这种情况下Sally
是Dalmation
的子级这是Dog
的孩子。
我认为广度优先搜索算法效果最好,因为较低的ID总是位于树上某个级别的左侧。我需要能够搜索树以查找值输入(在本例中为Sally
),然后在树中查找与树顶部直接链接的其他值(Animal
)。
答案 0 :(得分:0)
使用bfs / dfs来回答一个查询,说找到“Sally”就足够了。您将需要一个哈希表 H ,这样当遍历树并且您在一个节点上说 x 时,只需在哈希表中存储 x , H [x] =父(x)。另请注意,您可以将根节点的父节点标记为root本身或某些值(例如-1),然后使用-1。您可以使用bfs / dfs在遍历时查找填充哈希表的节点。现在,如果您收到“Sally”查询,请在使用bfs / dfs(不包含在伪代码中)后找到“Sally”之后执行以下操作:(它的伪代码不是特定语言)
search_element = sally // element to be searched
list=[] // empty list
while H[search_element]! = -1
list.append(H[search_element])
search_element = H[search_element]
你的清单看起来像 [动物,狗,dalmation] 所以你可以从一开始就说,莎莉是一种动物,它是一只狗,它是一种愚蠢。(或者你想要的任何顺序,因为你的树顺序有点混乱)。