1. 前言
使用B树来表示人事管理系统,其中每个节点代表一个人员,树的根节点为董事长,每个节点可以有多个子节点,表示下属。每一层代表一个等级分布。
- addPerson: 添加人员功能通过查找指定上司节点,然后将新的人员作为其子节点添加。
- deletePerson: 删除人员功能首先查找要删除人员的直接上司节点,然后从其子节点中删除该人员。
- updatePersonInfo: 更新人员信息功能通过查找指定人员节点,然后更新其信息。
- traversePersons: 遍历人员信息功能采用前序遍历方式,递归地遍历整个人员树。
- levelOrderTraversal: 按照职位进行层序遍历,以便展示不同职位的人员信息。
- searchPerson: 按照姓名进行搜索,采用递归方式在整个树中搜索指定姓名的人员节点。
- searchPosition: 按照职位进行搜索,返回指定职位的所有人员节点列表。
- main方法:在主函数中实现了用户交互功能,用户可以选择不同的功能编号来执行相应的操作。
2. 功能演示
研究以二叉树为例(人员个数及权值自定义),实现以下任务:
- 采用树的孩子兄弟链表等存储结构;
- 实现在人事关系树中查找、添加、删除人员功能;
- 创建树结构;
- 通过深度优先遍历搜索;
- 通过层次优先遍历搜索;
- 采用Java语言编写代码实现,并撰写实验报告。
【实验思路】
使用B树来表示人事管理系统,其中每个节点代表一个人员,树的根节点为董事长,每个节点可以有多个子节点,表示下属。每一层代表一个等级分布。
- addPerson: 添加人员功能通过查找指定上司节点,然后将新的人员作为其子节点添加。
- deletePerson: 删除人员功能首先查找要删除人员的直接上司节点,然后从其子节点中删除该人员。
- updatePersonInfo: 更新人员信息功能通过查找指定人员节点,然后更新其信息。
- traversePersons: 遍历人员信息功能采用前序遍历方式,递归地遍历整个人员树。
- levelOrderTraversal: 按照职位进行层序遍历,以便展示不同职位的人员信息。
- searchPerson: 按照姓名进行搜索,采用递归方式在整个树中搜索指定姓名的人员节点。
- searchPosition: 按照职位进行搜索,返回指定职位的所有人员节点列表。
- main方法:在主函数中实现了用户交互功能,用户可以选择不同的功能编号来执行相应的操作。
【实验步骤与实验结果】
- 默认初始化自动添加7个员工信息
代码
运行结果
- 查找员工的直属上司
- 按照名称查找员工信息
运行结果:
2.添加员工信息
代码
运行结果:
测试:
3.修改人员信息
代码:
运行结果:
4. 删除员工信息
代码:
运行结果:
5. 按照职位查询员工信息
代码
运行结果:
6.查询指定人员的下属
代码:
运行结果:
【实验小结】
本次实验通过实现人事管理系统,加深了对二叉树的理解,掌握了树的存储方法和遍历算法和树寻找父类的算法。加深了我对递归算法的理解。通过实践,更加熟练地运用了Java语言编程,提高了问题解决能力和编码能力。在未来的学习和工作中,将继续加强对数据结构的学习,提升编程水平。
代码总结
人的信息的javabean
package test;
public class Person {
private int id;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
节点类
package test;
import java.util.ArrayList;
import java.util.List;
/**
* @Description: 树的节点类、
* @Author: windStop
* @Date: 2024/6/12 16:37
*/
// 树的节点类
public class TreeNode {
int height; // 数的层数 (记录职位)
Person person; // 人员的个人信息
TreeNode parent; // 记录直属上司 (父亲)
List<TreeNode> children; // (记录下属,集合中的元素互为兄弟节点)
public TreeNode(Person person) {
this.person = person;
this.children = new ArrayList<>(); // 初始化 children 列表
}
}
核心功能代码:
package test;
import java.util.*;
// 人事管理系统
public class PersonManagementSystem {
// 根节点(董事长)
private TreeNode root;
private String[] position = {"董事长","经理","团队负责人","员工"};
public PersonManagementSystem(Person rootPerson) {
this.root = new TreeNode(rootPerson);
this.root.height = 1;
}
/**
* 添加人员
* @param parentPerson 要添加人员的直属上司(信息的javabean)
* @param childrenPerson 添加人员的信息
*/
public void addPerson(Person parentPerson, Person childrenPerson) {
TreeNode parentNode = findNode(root, parentPerson);
if (parentNode != null) {
TreeNode childNode = new TreeNode(childrenPerson);
parentNode.children.add(childNode);
childNode.parent = parentNode; // 记录父类
childNode.height = parentNode.height + 1; // 记录高度
} else {
System.err.println("节点没有找到,无法添加");
}
}
/**
* 递归寻找:查找人当前的节点
* @param node 查找人的:上司(递归会变)
* @param person 查找人的javabean
* @return
*/
public TreeNode findNode(TreeNode node, Person person) {
// 查找的人就是根节点
if (node.person.getId() == person.getId()) {
return node;
}
// 往下循环查找
for (TreeNode child : node.children) {
TreeNode found = findNode(child, person);//子问题
if (found != null) {//找到
return found;
}
}
return null;//找完也没有找到
}
/**
* 删除人员 -> 通过查找到该人员的直属上司,从直属上司的名单(list)中进行删除
* @param person 要删除人员的信息
* @return
*/
public boolean deletePerson(Person person) {
if (root == null) {
System.err.println("节点没有找到,无法删除。");
return false;
}
TreeNode parentNode = findParent(root, person);
if (parentNode != null) {
List<TreeNode> children = parentNode.children;
for (int i = 0; i < children.size(); i++) {
TreeNode child = children.get(i);
if (child.person.getId() == person.getId()) {
children.remove(i);
return true; // 成功删除
}
}
}
System.err.println("要删除的人员节点不存在。");
return false;
}
/**
* 递归寻找:查找人的父节点
* @param node 查找人的:上司(递归会变)
* @param person 查找人的javabean
* @return
*/
public TreeNode findParent(TreeNode node, Person person) {
for (TreeNode child : node.children) {
//当前节点是要找的节点的父节点
if (child.person.getId() == person.getId()) {
return node;
} else {
//当前节点不是,就递归查找 (子问题,以子节点为根)
TreeNode parent = findParent(child, person);
if (parent != null) {
return parent;
}
}
}
//找不到
return null;
}
/**
* 更新人员的信息
* @param oldPerson 老信息
* @param newPerson 新信息
* @return
*/
public boolean updatePersonInfo(Person oldPerson, Person newPerson) {
TreeNode nodeToUpdate = findNode(root, oldPerson);
if (nodeToUpdate != null) {
// 更新人员信息
nodeToUpdate.person.setName(newPerson.getName());
nodeToUpdate.person.setAge(newPerson.getAge());
nodeToUpdate.person.setId(newPerson.getId());
return true; // 成功更新
} else {
System.err.println("要更新的人员节点不存在。");
return false;
}
}
/**
* 遍历人员信息 -> 属于根左右 的前序遍历
* @param node 从跟开始遍历到结束
*/
public void traversePersons(TreeNode node) {
if (node != null) {
System.out.println("姓名:" + node.person.getName() + "\n工号为:" + node.person.getId());
for (TreeNode child : node.children) {
traversePersons(child);
}
}
}
// 层序遍历
// public void levelOrderTraversal() {
// if (root == null) return;
//
// Queue<TreeNode> queue = new LinkedList<>();
// queue.offer(root);
//
// while (!queue.isEmpty()) {
// int size = queue.size();
// for (int i = 0; i < size; i++) {
// TreeNode node = queue.poll();
// System.out.println(position[node.height - 1] + ":\n姓名:" + node.person.getName() + "\n工号为:" + node.person.getId());
// for (TreeNode child : node.children) {
// queue.offer(child);
// }
// }
// }
// }
/**
* 按照员工职位进行分类查询
*/
public void levelOrderTraversal() {
if (root == null) return;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int level = 1;
while (!queue.isEmpty()) {
int size = queue.size();
System.out.print(position[level - 1] + ":");
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
System.out.print( "工号:"+ node.person.getId() + ", 姓名:" + node.person.getName() + " ");
for (TreeNode child : node.children) {
queue.offer(child);
}
}
System.out.println();
level++;
}
}
/**
* 根据名称进行搜索
* @param name 人名
* @return
*/
public TreeNode searchPerson(String name) {
return searchPerson(root, name);
}
/**
* 递归搜索(按照人名)
* @param node
* @param name
* @return
*/
private TreeNode searchPerson(TreeNode node, String name) {
if (node.person.getName().equals(name)) {
return node;
} else {
for (TreeNode child : node.children) {
TreeNode found = searchPerson(child, name);
if (found != null) {
return found;
}
}
}
return null;
}
/**
* 按照职位进行搜索
* @param height 职位
* @return
*/
private List<TreeNode> searchPosition(int height) {
if (root == null) return null;
List<TreeNode> persons = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node != null && node.height == height) {
persons.add(node);
}
if (node != null) {
for (TreeNode child : node.children) {
queue.offer(child);
}
}
}
}
return persons;
}
public static void main(String[] args) {
// 默认创建的人员
// 创建人员
Person chairman = new Person(1, "蔡申友", 18);
Person manager = new Person(2, "李四", 19);
Person teamLeader1 = new Person(3, "王五", 20);
Person teamLeader2 = new Person(4, "赵六", 31);
Person staff1 = new Person(5, "小明", 32);
Person staff2 = new Person(6, "小红", 33);
Person staff3 = new Person(7, "小李", 34);
// 创建人事管理系统
PersonManagementSystem system = new PersonManagementSystem(chairman);
// 添加人员
system.addPerson(chairman, manager);
system.addPerson(manager, teamLeader1);
system.addPerson(manager, teamLeader2);
system.addPerson(teamLeader1, staff1);
system.addPerson(teamLeader1, staff2);
system.addPerson(teamLeader2, staff3);
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("-------------------------------");
System.out.println("------请选择功能:---------------");
System.out.println("-----1. 添加人员----------------");
System.out.println("-----2. 修改人员信息-------------");
System.out.println("-----3. 删除人员----------------");
System.out.println("-----4. 按照名称查找人员----------");
System.out.println("-----5. 遍历人员信息-------------");
System.out.println("-----6. 按职位遍历人员信息-------");
System.out.println("-----7. 查询人员的管理名单-------");
System.out.println("-----8. 退出程序----------------");
System.out.println("-------请输入对应功能的编号:-----");
System.out.println("-------------------------------");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("请输入你要添加的人员职位:");
System.out.println("1. 董事长");
System.out.println("2. 经理 ");
System.out.println("3. 团队负责人");
System.out.println("4. 员工");
int x = scanner.nextInt();
if (x == 1){
System.err.println("因为已存在董事长,无法添加董事长");
return;
}
List<TreeNode> treeNodes = system.searchPosition(x - 1);
if (treeNodes != null){
System.out.println("查询到的上司信息如下图所示:");
System.out.println("请选择你要添加人员的上司:");
for (int i = 0; i < treeNodes.size(); i++) {
System.out.println(i + 1 + ". " + treeNodes.get(i).person.getName());
}
}else {
System.out.println("该上司职位没有人员,无法添加。");
}
int choose = scanner.nextInt();
TreeNode parent = system.searchPerson(treeNodes.get(choose - 1).person.getName());
System.out.println("---请输入:你要添加人员的工号:");
int id = scanner.nextInt();
System.out.println("---请输入:你要添加人员的名称:");
String name = scanner.next();
System.out.println("---请输入:你要添加人员的年龄:");
int age = scanner.nextInt();
Person child = new Person(id,name,age);
system.addPerson(parent.person, child);
break;
case 2:
// 修改人员信息
System.out.println("请输入:你要修改人员的名称:");
String updateName = scanner.next();
TreeNode updateNode = system.searchPerson(updateName);
if (updateNode == null){
System.out.println("不存在此人无法查询!");
break;
}
Person oldPerson = updateNode.person;
System.out.println("---请输入:你要修改人员的工号:");
int updateId = scanner.nextInt();
System.out.println("---请输入:你要修改人员的名称:");
String updateNewName = scanner.next();
System.out.println("---请输入:你要修改人员的年龄:");
int updateage = scanner.nextInt();
Person newPerson = new Person(updateId,updateNewName,updateage);
system.updatePersonInfo(oldPerson, newPerson);
break;
case 3:
// 删除人员
System.out.println("请输入:你要删除人员的名称:");
String deleteName = scanner.next();
TreeNode deleteNode = system.searchPerson(deleteName);
if (deleteNode == null){
System.out.println("不存在此人无法查询!");
break;
}
Person personToDelete = deleteNode.person;
system.deletePerson(personToDelete);
break;
case 4:
// 查找人员
System.out.print("请输入要查找的人员姓名:");
String nameToSearch = scanner.next();
TreeNode foundNode = system.searchPerson(nameToSearch);
if (foundNode != null) {
System.out.println("找到了该人员信息:");
System.out.println("姓名:" + foundNode.person.getName() + "\n工号:" + foundNode.person.getId());
} else {
System.out.println("未找到该人员信息。");
}
break;
case 5:
// 遍历人员信息
system.traversePersons(system.root);
break;
case 6:
// 层序遍历人员信息
system.levelOrderTraversal();
break;
case 7:
// 查询指定名称的人员的下属
System.out.println("请输入:你要查询人员的名称:");
String findName = scanner.next();
TreeNode treeNode = system.searchPerson(findName);
if (treeNode == null){
System.out.println("不存在此人无法查询!");
break;
}
System.out.print(system.position[treeNode.height - 1] + ":" +findName + "对应的管理下属信息为:");
for (TreeNode node : treeNode.children) {
System.out.print( "工号:"+ node.person.getId() + ", 姓名:" + node.person.getName() + " ");
}
System.out.println();
break;
case 8:
// 退出程序
System.out.println("程序已退出。");
System.exit(0);
default:
System.out.println("请输入有效的功能编号。");
}
}
}
}
标签:node,TreeNode,人事,管理系统,System,员工,person,println,out
From: https://blog.csdn.net/m0_74749208/article/details/139634290