一棵广度和深度都未知的树,存储于数据库的表中,节点存储顺序随机,表结构如下 Id 该节点的 ID(自增主键) ParentId 该节点的父节点 ID Name 节点名称 该表已经从数据库读取完成并加载到内存,并存储在变量 NodeList 中。请实现删除方法: Delete(int TargetID):实现从 NodeList 中删除 Id 为 TargetId 的节点及其所有子节点。用python实现
时间: 2024-02-17 18:00:38 浏览: 106
好的,针对您的问题,我可以提供如下的 Python 代码实现:
```python
class Node:
def __init__(self, id, parent_id, name):
self.id = id
self.parent_id = parent_id
self.name = name
self.children = []
class NodeList:
def __init__(self, nodes):
self.nodes = nodes
self.root = None
self.node_dict = {}
# 构建节点字典,以便根据 ID 查找节点
for node in nodes:
self.node_dict[node.id] = node
# 找到根节点
for node in nodes:
if node.parent_id is None:
self.root = node
else:
parent = self.node_dict[node.parent_id]
parent.children.append(node)
def Delete(self, TargetID):
node = self.node_dict.get(TargetID)
if node is not None:
self.DeleteNode(node)
del self.node_dict[TargetID]
def DeleteNode(self, node):
for child in node.children:
self.DeleteNode(child)
del node
```
这里我们定义了一个节点类 Node,其中包含 id、parent_id、name 和 children 四个属性。我们还定义了一个 NodeList 类,其中包含 nodes、root 和 node_dict 三个属性。nodes 存储所有节点,root 存储根节点,node_dict 存储节点字典,以便根据 ID 查找节点。
构造函数中,我们首先遍历所有节点,将它们添加到节点字典中。然后我们找到根节点,并根据节点的 parent_id 属性将所有节点添加到父节点的 children 列表中。
Delete 方法中,我们先根据目标 ID 查找到要删除的节点,然后递归删除该节点的所有子节点,最后从节点字典中删除该节点。
DeleteNode 方法实现了递归删除节点及其所有子节点的功能。
这样,我们就可以通过 NodeList 类的 Delete 方法来删除任意一个节点及其所有子节点了。
阅读全文