用Java编写一个家族树存储一个家族的族谱,并提供查询和修改。要求刚开始的族谱里至少有10人,能够查询某个指定人物的双亲和他所有的子孙,新增子孙的插入,指定人物由键盘输入。测试上述所有功能。要求使用树相关知识实现。
时间: 2024-03-09 19:47:18 浏览: 89
好的,这是一个比较复杂的问题,需要用到树的相关知识。下面是一个简单的Java代码示例,可以用来实现这个需求:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class FamilyTree {
private static class TreeNode {
String name;
List<TreeNode> children;
TreeNode parent;
TreeNode(String name) {
this.name = name;
children = new ArrayList<>();
parent = null;
}
}
private TreeNode root;
public FamilyTree() {
root = new TreeNode("祖先");
buildTree();
}
private void buildTree() {
TreeNode p1 = new TreeNode("父亲1");
p1.parent = root;
root.children.add(p1);
TreeNode p2 = new TreeNode("父亲2");
p2.parent = root;
root.children.add(p2);
TreeNode p3 = new TreeNode("父亲3");
p3.parent = root;
root.children.add(p3);
TreeNode c1 = new TreeNode("孩子1");
c1.parent = p1;
p1.children.add(c1);
TreeNode c2 = new TreeNode("孩子2");
c2.parent = p1;
p1.children.add(c2);
TreeNode c3 = new TreeNode("孩子3");
c3.parent = p2;
p2.children.add(c3);
TreeNode c4 = new TreeNode("孩子4");
c4.parent = p2;
p2.children.add(c4);
TreeNode c5 = new TreeNode("孩子5");
c5.parent = p3;
p3.children.add(c5);
TreeNode gc1 = new TreeNode("孙子1");
gc1.parent = c1;
c1.children.add(gc1);
TreeNode gc2 = new TreeNode("孙子2");
gc2.parent = c2;
c2.children.add(gc2);
TreeNode gc3 = new TreeNode("孙子3");
gc3.parent = c3;
c3.children.add(gc3);
TreeNode gc4 = new TreeNode("孙子4");
gc4.parent = c4;
c4.children.add(gc4);
TreeNode gc5 = new TreeNode("孙子5");
gc5.parent = c5;
c5.children.add(gc5);
}
public TreeNode find(String name) {
return find(root, name);
}
private TreeNode find(TreeNode node, String name) {
if (node.name.equals(name)) {
return node;
}
for (TreeNode child : node.children) {
TreeNode found = find(child, name);
if (found != null) {
return found;
}
}
return null;
}
public void add(String name, String parentName) {
TreeNode parent = find(parentName);
if (parent == null) {
System.out.println("找不到父亲节点:" + parentName);
return;
}
TreeNode node = new TreeNode(name);
node.parent = parent;
parent.children.add(node);
}
public void printAll(TreeNode node) {
System.out.print(node.name + " ");
for (TreeNode child : node.children) {
printAll(child);
}
}
public static void main(String[] args) {
FamilyTree tree = new FamilyTree();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入要查询的人物名称:");
String name = scanner.nextLine();
TreeNode node = tree.find(name);
if (node == null) {
System.out.println("找不到指定的人物:" + name);
continue;
}
System.out.println(name + "的父亲是:" + (node.parent != null ? node.parent.name : "无"));
System.out.print(name + "的子孙是:");
tree.printAll(node);
System.out.println();
System.out.println("请输入要添加的人物名称和父亲名称(用空格分隔):");
String[] parts = scanner.nextLine().split(" ");
if (parts.length != 2) {
System.out.println("输入格式错误!");
continue;
}
tree.add(parts[0], parts[1]);
System.out.println("添加成功!");
}
}
}
```
这段代码定义了一个`FamilyTree`类,其中包含了一个`TreeNode`内部类用来表示树的节点。`FamilyTree`类中定义了`buildTree()`方法来初始化家族树,其中包含了10个节点,包括3个父亲、5个孩子和2个孙子。`find()`方法用来查找指定节点,`add()`方法用来添加新节点,`printAll()`方法用来打印指定节点的子孙。
在`main()`方法中,我们首先初始化一个`FamilyTree`对象,然后通过循环来反复查询和添加节点。对于每次查询,我们首先输入要查询的人物名称,然后调用`find()`方法来查找指定节点。如果找不到该节点,则输出错误信息并继续下一轮循环;否则,输出该节点的父亲和所有子孙。对于每次添加,我们首先输入要添加的人物名称和父亲名称,然后调用`add()`方法来添加新节点。如果父亲节点不存在,则输出错误信息。
你可以根据需要修改节点的名称和数量,然后运行代码来测试它是否符合你的需求。
阅读全文