深度优先搜索树中dict()的使用及NoName类方法调用问题
问题解答
一、正确调用add_new_node方法
Python中调用类的实例方法,必须先创建类的实例,不能直接用类名调用(除非是静态/类方法,这里属于实例方法)。
错误调用的问题
你写的NoName.add_new_node('a':1)存在两个问题:
- 直接通过类名调用实例方法,未创建类的实例;
- 参数写法错误,
'a':1是字典键值对的语法,不是合法的参数传递格式。
正确调用示例
# 1. 创建类的实例 obj = NoName() # 2. 调用实例方法,仅需传入label参数,self由Python自动传入 obj.add_new_node('a') # label可以是任意可哈希类型,比如数字 obj.add_new_node(123)
调用后,obj.some_dict会变成{'a': {}, 123: {}}。
二、位置参数的正确传递
位置参数指按照方法定义的参数顺序依次传入值,无需指定参数名。比如add_new_node的参数顺序是self(自动传入)→ label,调用时直接传label的对应值即可,比如obj.add_new_node('node1'),这里'node1'就是传给label的位置参数。
如果方法有多个参数,例如:
def add_node(self, label, value): self.some_dict[label] = value
调用时按顺序传参:obj.add_node('a', 1),其中'a'对应label,1对应value,这就是标准的位置参数传递方式。
三、深度优先搜索(DFS)中使用字典
字典可以天然表示树结构:用键作为节点标识,值作为子节点集合(嵌套字典),完美匹配树的层级关系。
字典实现DFS的示例
先构建一个层级树结构:
obj = NoName() obj.add_new_node('root') # 给root添加子节点 obj.some_dict['root']['node_a'] = {} obj.some_dict['root']['node_a']['node_a1'] = {} obj.some_dict['root']['node_a']['node_a2'] = {} obj.some_dict['root']['node_b'] = {}
再实现DFS遍历:
def dfs(node, current_path): # 打印当前节点路径 print(current_path + [node]) # 递归遍历所有子节点 for child_node in obj.some_dict[node].keys(): dfs(child_node, current_path + [node]) # 从根节点开始遍历 dfs('root', [])
遍历输出结果:
['root'] ['root', 'node_a'] ['root', 'node_a', 'node_a1'] ['root', 'node_a', 'node_a2'] ['root', 'node_b']
字典在DFS中的优势
- 子节点查找高效:通过键直接访问子节点集合,时间复杂度O(1);
- 结构灵活:可在字典中存储节点额外信息,比如节点值、权重,例如
self.some_dict[label] = {'value': 10, 'children': {}}; - 层级关系直观:嵌套字典天然对应树的层级结构,易于理解和维护。
内容的提问来源于stack exchange,提问作者Dogdigger
相关产品推荐
相关产品推荐

