我不得不解决学校使用A *的一个微不足道的问题(这不是我遇到的问题),我想用树来存储探索节点所以当找到解决方案时,很容易找到从叶子到根的路径。Python递归树问题(添加元素或任意节点)
Python中的树可以通过使用defaultdictionaries进行:
def tree(): return defaultdict(tree)
因此,例如:
a=tree() is an empty tree
a[1] tree with one root node
a[1][2] has a child of 2
a[1][2]['another']... and so on.
我试图让想补充一个新的节点给出的任意节点(k)给定树(a)和期望的新节点。我只能用递归算出它。
def addNode(a,k,newNode):
for x in list(a.keys()):
if x!=k:
a[addNode(a[x],k,newNode)]
if x==k:
a[x][newNode]
break
但我不明白递归太好,不足以做正确的;这最终会向父节点添加新节点,但会添加无节点。因此,这里是另一个例子:
a=tree()
a
defaultdict(, {})
a[1]
defaultdict(, {})
a[1][2]
defaultdict(, {})
a[1][3]
defaultdict(, {})
a[1][2]['b']
defaultdict(, {})
addNode(a,'b','new')
a
defaultdict(, {1: defaultdict(, {2: defaultdict(, {'b': defaultdict(, {'new': defaultdict(, {})})}), 3: defaultdict(, {}), None: defaultdict(, {})}), None: defaultdict(, {})})
如何正确地实现这一点,为什么是ADDNODE程序使这些无节点?我看到我必须正确地退出递归,那么怎么做呢?
此外,我试图恢复的路径如下:
parentList=[]
found=False
def getPath(tree,final):
global found
for x in list(tree.keys()):
parentList.append(x)
if found:
parentList.pop()
if x==final:
found=True
else:
getPath(tree[x],final)
if not found:
parentList.pop()
我尝试,直到目标节点发现所有的家长加入到堆栈中,然后弹出了所有的父母,直到只拿到了路径目标状态保持在堆栈上。我怎么能以优雅的方式做到这一点?