代码存储一个家族的族谱,并提供查询和修改。要求刚开始的族谱里至少有10人,能够查询某个指定人物的双亲和他所有的子孙,新增子孙的插入,指定人物由键盘输入。测试上述所有功能。要求使用树相关知识实现。
时间: 2024-03-17 13:43:57 浏览: 20
好的,以下是符合您要求的Python代码实现,注释中有详细的解释:
```python
class Person:
def __init__(self, name, gender, birthdate):
self.name = name
self.gender = gender
self.birthdate = birthdate
self.mother = None
self.father = None
self.children = []
class BinaryTreeNode:
def __init__(self, person):
self.person = person
self.left = None
self.right = None
class BinarySearchTree:
def __init__(self):
self.root = None
def insert(self, person):
new_node = BinaryTreeNode(person)
if not self.root:
self.root = new_node
return
current_node = self.root
while True:
if person.name < current_node.person.name:
if current_node.left is None:
current_node.left = new_node
return
current_node = current_node.left
else:
if current_node.right is None:
current_node.right = new_node
return
current_node = current_node.right
def search(self, name):
current_node = self.root
while current_node is not None:
if name == current_node.person.name:
return current_node.person
elif name < current_node.person.name:
current_node = current_node.left
else:
current_node = current_node.right
return None
def delete(self, name):
def delete_node(node):
if node is None:
return None
if node.left is None and node.right is None:
return None
if node.left is None:
return node.right
if node.right is None:
return node.left
temp_node = node.right
while temp_node.left is not None:
temp_node = temp_node.left
node.person = temp_node.person
node.right = delete_node(node.right)
return node
current_node = self.root
parent_node = None
while current_node is not None:
if name == current_node.person.name:
if parent_node is None:
self.root = delete_node(current_node)
else:
if name < parent_node.person.name:
parent_node.left = delete_node(current_node)
else:
parent_node.right = delete_node(current_node)
return True
elif name < current_node.person.name:
parent_node = current_node
current_node = current_node.left
else:
parent_node = current_node
current_node = current_node.right
return False
def _get_children(self, node):
children = []
if node.left:
children.extend(self._get_children(node.left))
children.append(node.person)
if node.right:
children.extend(self._get_children(node.right))
return children
def get_descendants(self, name):
person = self.search(name)
if person is None:
return None
descendants = []
for child in person.children:
descendants.extend(self._get_children(BinaryTreeNode(child)))
return descendants
def get_ancestors(self, name):
person = self.search(name)
if person is None:
return None
ancestors = []
if person.mother:
ancestors.append(person.mother)
ancestors.extend(self.get_ancestors(person.mother.name))
if person.father:
ancestors.append(person.father)
ancestors.extend(self.get_ancestors(person.father.name))
return ancestors
# 初始族谱信息
family_tree = BinarySearchTree()
p1 = Person('A', 'M', '1970-01-01')
p2 = Person('B', 'F', '1975-02-15')
p3 = Person('C', 'M', '1980-03-20')
p4 = Person('D', 'F', '1985-04-25')
p5 = Person('E', 'M', '1990-05-30')
p6 = Person('F', 'F', '1995-06-10')
p7 = Person('G', 'M', '2000-07-15')
p8 = Person('H', 'F', '2005-08-20')
p9 = Person('I', 'M', '2010-09-25')
p10 = Person('J', 'F', '2015-10-30')
p2.mother = p1
p2.father = p3
p1.children.append(p2)
p3.children.append(p2)
p4.mother = p2
p4.father = p5
p2.children.append(p4)
p5.children.append(p4)
p6.mother = p5
p6.father = p7
p5.children.append(p6)
p7.children.append(p6)
p8.mother = p6
p8.father = p9
p6.children.append(p8)
p9.children.append(p8)
p10.mother = p7
p7.children.append(p10)
family_tree.insert(p1)
family_tree.insert(p2)
family_tree.insert(p3)
family_tree.insert(p4)
family_tree.insert(p5)
family_tree.insert(p6)
family_tree.insert(p7)
family_tree.insert(p8)
family_tree.insert(p9)
family_tree.insert(p10)
# 测试查询某个指定人物的双亲和所有子孙
name = input('请输入要查询的人物名字:')
person = family_tree.search(name)
if person is None:
print('该人物不存在!')
else:
print(f'该人物的母亲是:{person.mother.name if person.mother else "未知"}')
print(f'该人物的父亲是:{person.father.name if person.father else "未知"}')
descendants = family_tree.get_descendants(name)
if len(descendants) > 0:
print(f'该人物的所有子孙是:{", ".join([child.name for child in descendants])}')
else:
print('该人物没有子孙!')
# 测试新增子孙的插入
name = input('请输入新子孙的名字:')
gender = input('请输入新子孙的性别(M/F):')
birthdate = input('请输入新子孙的出生日期(YYYY-MM-DD):')
parent_name = input('请输入新子孙的父母名字:')
parent = family_tree.search(parent_name)
if parent is None:
print('该父母不存在!')
else:
new_child = Person(name, gender, birthdate)
new_child.mother = parent if gender == 'F' else parent.mother
new_child.father = parent if gender == 'M' else parent.father
parent.children.append(new_child)
family_tree.insert(new_child)
print(f'新增子孙{name}成功!')
# 测试删除节点
name = input('请输入要删除的人物名字:')
if family_tree.delete(name):
print(f'删除{name}成功!')
else:
print(f'删除{name}失败,该人物不存在!')
```
请注意,上述代码中使用了一些简化,如忽略了读取文件等步骤,仅仅是为了方便演示。在实际应用中,您需要根据实际情况进行相应的修改和完善。