我有以下树数据结构:
class TreeNode:
def __init__(self, path, value=None):
self.path = path
self.value = value
self.children = []
path目录或文件名在哪里。如果 的值为path文件(树中的叶子),则值为整数,否则为None. 这是此树结构的示例:
└── root (None)
├── dir0 (None)
| ├── dir00 (None)
| | └── file000.txt (10)
| └── file00.txt (10)
├── dir1 (None)
| └── file10.txt (5)
├── dir2 (None)
| ├── file20.txt (10)
| └── file21.txt (15)
└── dir3 (None)
├── dir30 (None)
| └── file300.txt (15)
└── file30.txt (10)
我正在尝试返回已解决路径及其关联的最小可能展平列表value。如果子树中的所有节点都具有相同的value,那么我们说这样的子树与value它的节点相同。本质上,value如果父节点的所有子节点都具有相同的value.
例如,上面的树应该返回的是:
/root/dir0: 10
/root/dir1: 5
/root/dir2/file20.txt: 10
/root/dir2/file21.txt: 15
/root/dir3/dir30: 15
/root/dir3/file30.txt: 10
我尝试了几种不同的方法来实现这一点:用堆栈遍历树,用递归遍历树,以及使用集合;一切都失败了。我最近尝试的伪代码如下所示:
def build_list(self, treenode):
if treenode.value:
return [(treenode.path, treenode.value)]
if treenode.value == None:
s = set()
for child in treenode.children:
potential_values = self.build_list(child)
for val in potential_values:
s |= {val[1]}
if len(s) == 1:
return [(treenode.path, treenode.value)]
else:
return [(child.path, child.value) for child in treenode.children]
我将如何做到这一点?伪代码完全没问题,我正在寻找一种方法,不一定是完整的实现。
智慧大石
不负相思意
相关分类