java用树的知识是实现族谱查询和添加
时间: 2024-04-21 07:29:27 浏览: 24
是的,Java中使用树的知识可以实现族谱查询和添加。可以使用树形结构来表示一个家族的族谱,每个节点表示一个家庭成员,包括其姓名、性别、出生日期等信息,并且每个节点还包含指向其父亲节点和子节点的引用。这样就可以通过遍历树来查询和添加家庭成员的信息。查询操作可以通过深度优先遍历或广度优先遍历实现,添加操作可以通过找到对应的节点并添加其子节点来实现。使用树的知识可以使族谱查询和添加的操作更加高效和方便。
相关问题
怎么用java用树的知识是实现族谱查询和添加
使用Java实现族谱查询和添加,需要先定义一个节点类来表示家庭成员,包括其姓名、性别、出生日期等信息,并且每个节点还包含指向其父亲节点和子节点的引用。具体实现可以参考以下代码:
```java
class TreeNode {
private String name;
private String gender;
private String birth;
private TreeNode parent;
private List<TreeNode> children;
public TreeNode(String name, String gender, String birth) {
this.name = name;
this.gender = gender;
this.birth = birth;
this.parent = null;
this.children = new ArrayList<>();
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
public void addChild(TreeNode child) {
children.add(child);
child.setParent(this);
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public String getBirth() {
return birth;
}
public TreeNode getParent() {
return parent;
}
public List<TreeNode> getChildren() {
return children;
}
}
```
在定义好节点类之后,就可以使用树的数据结构来存储家族的族谱了。可以定义一个根节点来表示家族的祖先,然后通过添加子节点的方式来扩展树形结构。具体实现可以参考以下代码:
```java
public class FamilyTree {
private TreeNode root;
public FamilyTree(String rootName, String rootGender, String rootBirth) {
this.root = new TreeNode(rootName, rootGender, rootBirth);
}
public TreeNode getRoot() {
return root;
}
public void addNode(String parentName, String parentGender, String parentBirth, String childName, String childGender, String childBirth) {
TreeNode parentNode = findNode(root, parentName, parentGender, parentBirth);
if (parentNode != null) {
TreeNode childNode = new TreeNode(childName, childGender, childBirth);
parentNode.addChild(childNode);
}
}
public TreeNode findNode(TreeNode node, String name, String gender, String birth) {
if (node == null) {
return null;
}
if (node.getName().equals(name) && node.getGender().equals(gender) && node.getBirth().equals(birth)) {
return node;
}
for (TreeNode childNode : node.getChildren()) {
TreeNode result = findNode(childNode, name, gender, birth);
if (result != null) {
return result;
}
}
return null;
}
}
```
在实现好族谱添加和查询的功能之后,就可以通过调用相应的方法来实现具体的操作了。例如,可以先创建一个家族树对象,然后添加一些家庭成员,最后通过遍历树来查询某个家庭成员的信息。具体实现可以参考以下代码:
```java
public class Main {
public static void main(String[] args) {
FamilyTree familyTree = new FamilyTree("祖先", "男", "1900-01-01");
familyTree.addNode("祖先", "男", "1900-01-01", "父亲", "男", "1930-01-01");
familyTree.addNode("祖先", "男", "1900-01-01", "叔叔", "男", "1935-01-01");
familyTree.addNode("祖先", "女", "1900-01-01", "姑姑", "女", "1938-01-01");
familyTree.addNode("父亲", "男", "1930-01-01", "我", "男", "1980-01-01");
familyTree.addNode("父亲", "女", "1932-01-01", "姐姐", "女", "1965-01-01");
// 查询我父亲的姓名、性别、出生日期
TreeNode parentNode = familyTree.findNode(familyTree.getRoot(), "父亲", "男", "1930-01-01");
if (parentNode != null) {
System.out.println("姓名:" + parentNode.getName() + ",性别:" + parentNode.getGender() + ",出生日期:" + parentNode.getBirth());
}
// 查询我祖先的所有子孙
List<TreeNode> descendants = new ArrayList<>();
getDescendants(familyTree.getRoot(), descendants);
for (TreeNode descendant : descendants) {
System.out.println("姓名:" + descendant.getName() + ",性别:" + descendant.getGender() + ",出生日期:" + descendant.getBirth());
}
}
public static void getDescendants(TreeNode node, List<TreeNode> descendants) {
if (node == null) {
return;
}
descendants.add(node);
for (TreeNode childNode : node.getChildren()) {
getDescendants(childNode, descendants);
}
}
}
```
通过以上的代码,就可以实现一个简单的家族族谱查询和添加功能了。
如何用java代码实现存储一个家族的族谱,并提供查询和修改。要求刚开始的族谱里至少有10人,能够查询某个指定人物的双亲和他所有的子孙,新增子孙的插入,指定人物由键盘输入。测试上述所有功能。要求使用树相关知识实现。
这是一个相对复杂的问题,需要使用树的相关知识和Java编程技术实现。下面是一个简单的实现示例,供您参考:
```
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class FamilyTree {
// 家族成员类
static class Member {
String name; // 姓名
Member father; // 父亲
List<Member> children; // 孩子
public Member(String name) {
this.name = name;
this.children = new ArrayList<>();
}
// 添加孩子
public void addChild(Member child) {
children.add(child);
child.father = this;
}
}
public static void main(String[] args) {
// 初始族谱
Member root = new Member("祖先");
Member m1 = new Member("父亲");
Member m2 = new Member("叔叔");
Member m3 = new Member("伯伯");
Member m4 = new Member("儿子1");
Member m5 = new Member("儿子2");
Member m6 = new Member("侄子1");
Member m7 = new Member("侄子2");
Member m8 = new Member("侄孙1");
Member m9 = new Member("侄孙2");
Member m10 = new Member("孙子1");
Member m11 = new Member("孙子2");
root.addChild(m1);
root.addChild(m2);
root.addChild(m3);
m1.addChild(m4);
m1.addChild(m5);
m2.addChild(m6);
m2.addChild(m7);
m6.addChild(m8);
m7.addChild(m9);
m4.addChild(m10);
m5.addChild(m11);
// 构建家族成员Map,方便查询
Map<String, Member> members = new HashMap<>();
members.put(root.name, root);
members.put(m1.name, m1);
members.put(m2.name, m2);
members.put(m3.name, m3);
members.put(m4.name, m4);
members.put(m5.name, m5);
members.put(m6.name, m6);
members.put(m7.name, m7);
members.put(m8.name, m8);
members.put(m9.name, m9);
members.put(m10.name, m10);
members.put(m11.name, m11);
// 测试查询和修改功能
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入要查询或修改的家族成员姓名:");
String name = scanner.nextLine();
Member member = members.get(name);
if (member == null) {
System.out.println("找不到该成员!");
continue;
}
System.out.println("该成员的父亲是:" + (member.father == null ? "无" : member.father.name));
System.out.println("该成员的孩子有:");
for (Member child : member.children) {
System.out.println(child.name);
}
System.out.println("请选择要进行的操作:1-新增孩子,2-退出");
int option = scanner.nextInt();
scanner.nextLine();
if (option == 1) {
System.out.println("请输入要新增孩子的姓名:");
String childName = scanner.nextLine();
Member child = new Member(childName);
member.addChild(child);
members.put(childName, child);
System.out.println("新增孩子成功!");
} else if (option == 2) {
break;
} else {
System.out.println("无效的操作!");
}
}
}
}
```
在这个示例中,我们使用了树的数据结构来存储家族成员的族谱,每个成员都是一个节点,有父亲和孩子。构建家族成员Map可以方便地查询和修改家族成员。在主函数中,我们先构建了一个初始的家族成员,然后通过Scanner从键盘输入要查询或修改的成员姓名,查询该成员的父亲和孩子,并提供了新增孩子的功能,直到用户选择退出。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)