python defaultdict 递归_Python递归树问题(添加元素或任意节点)

我不得不解决学校使用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()

我尝试,直到目标节点发现所有的家长加入到堆栈中,然后弹出了所有的父母,直到只拿到了路径目标状态保持在堆栈上。我怎么能以优雅的方式做到这一点?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值