定义一个节点结构体,包括节点的名称、双亲节点、子节点,定义一个根节点,作为族谱的根节点,初始化族谱,添加至少10个节点,提供查询功能,根据输入的指定人物名称,递归查找其双亲节点和所有子孙节,提供修改功能,根据输入的指定人物名称,将其修改为新的名称,并更新其子孙节点的双亲节点,用Java代码实现
时间: 2023-12-10 13:03:29 浏览: 68
好的,让我来为您提供这个问题的Java代码实现。
```
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class FamilyTree {
// 定义节点结构体
public static class Node {
String name; // 节点名称
Node parent; // 双亲节点
List<Node> children; // 子节点
// 构造方法
public Node(String name, Node parent) {
this.name = name;
this.parent = parent;
this.children = new ArrayList<>();
}
}
public static void main(String[] args) {
// 初始化族谱
Node root = new Node("始祖", null);
Node node1 = new Node("A", root);
root.children.add(node1);
Node node2 = new Node("B", root);
root.children.add(node2);
Node node3 = new Node("C", node1);
node1.children.add(node3);
Node node4 = new Node("D", node1);
node1.children.add(node4);
Node node5 = new Node("E", node2);
node2.children.add(node5);
Node node6 = new Node("F", node2);
node2.children.add(node6);
Node node7 = new Node("G", node5);
node5.children.add(node7);
Node node8 = new Node("H", node5);
node5.children.add(node8);
Node node9 = new Node("I", node6);
node6.children.add(node9);
// 查询功能
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查询的人物名称:");
String name = scanner.nextLine();
Node node = findNodeByName(name, root);
if (node != null) {
System.out.println("该人物的双亲节点为:" + (node.parent != null ? node.parent.name : "无"));
System.out.println("该人物的所有子孙节点为:");
printDescendants(node);
} else {
System.out.println("未找到该人物!");
}
// 修改功能
System.out.println("请输入要修改的人物名称:");
String oldName = scanner.nextLine();
System.out.println("请输入新的人物名称:");
String newName = scanner.nextLine();
node = findNodeByName(oldName, root);
if (node != null) {
node.name = newName; // 修改节点名称
updateDescendantsParent(node); // 更新子孙节点的双亲节点
System.out.println("修改成功!");
} else {
System.out.println("未找到该人物!");
}
}
// 根据名称查找节点
public static Node findNodeByName(String name, Node root) {
if (root == null || root.name.equals(name)) {
return root;
}
for (Node child : root.children) {
Node node = findNodeByName(name, child);
if (node != null) {
return node;
}
}
return null;
}
// 打印某节点的所有子孙节点
public static void printDescendants(Node node) {
if (node == null) {
return;
}
for (Node child : node.children) {
System.out.println(child.name);
printDescendants(child);
}
}
// 更新某节点的所有子孙节点的双亲节点
public static void updateDescendantsParent(Node node) {
if (node == null) {
return;
}
for (Node child : node.children) {
child.parent = node;
updateDescendantsParent(child);
}
}
}
```
这个程序实现了定义一个节点结构体,包括节点的名称、双亲节点、子节点,定义一个根节点,作为族谱的根节点,初始化族谱,添加至少10个节点,提供查询功能,根据输入的指定人物名称,递归查找其双亲节点和所有子孙节,提供修改功能,根据输入的指定人物名称,将其修改为新的名称,并更新其子孙节点的双亲节点。
阅读全文