python - 二叉树节点位置和帮助字典
问题描述
谢谢你的帮助
背景
我有一个关于在树中定位节点的问题。
我有一个简单的二叉树。每个节点中都有一条数据。假设它看起来像这样:
a
/ \
b c
哪里a=root
, b=root.left
,c=root.right
树不是手动创建的。假设我收到添加new_data
到节点 c 的请求。
我很困惑如何知道 c 在哪里而不显式编写root.right.data=new_data
.
我的第一个想法是创建某种类型的辅助字典,并引用节点位置,例如:
helper = {
'a'= root,
'b'= root.left,
'c'= root.right
}
这样当我收到请求时,我可以去找助手并说一些大意的东西:
helper.get('c').data=new_data
问题
我在正确的球场吗?递归地反复搜索整棵树似乎有点多 - 当树改变其节点结构时,这个助手可能会偶尔更新。
当我递归爬取树时,我对如何实际返回每个节点的位置感到困惑。我怎样才能创建这个助手?
解决方案
回答
答案是递归搜索。我对助手 dict 的想法源于我对 BST 的不熟悉。我将以下内容添加到我的节点以搜索树的预排序:
def find_node(self, start, id):
if start:
if start.id == id:
return start
else:
node = self.find_node(start.left, id)
if node:
return node
else:
node = self.find_node(start.right, id)
if node:
return node
else:
return None
该视频对帮助我了解 BST 非常有帮助。我意识到,当我找到正确的id
.
推荐阅读
- wix - 如何解决错误:light.exe 错误 LGHT1105
- elasticsearch - 使用 JS SDK 的 ElasticSearch 批量 API
- python - 错误:TypeError:不能将序列乘以“float”类型的非整数
- javascript - 如果数组中的选项值jQuery添加输入选项类
- vb6 - VB6比较list1和list2并从list2中删除不需要的项目
- android - GalaSoft.MvvmLight 的 AppCompatActivityBase 的 Prism 版本是什么?
- java - PatternDescr 中的 Drools AndDescr(和 OrDescr)
- c++ - cin>>gender 和 cin>>*gender 有什么区别(c风格的文本字符串)
- python - 如何使用文件列表作为输入来删除数据行?
- javascript - Ag-Grid 中有没有办法让选择下拉单元格编辑器也有一个自定义单元格呈现按钮触发事件?