使用B树实现员工(人事)管理系统

news2025/1/31 11:31:13

1. 前言
 

使用B树来表示人事管理系统,其中每个节点代表一个人员,树的根节点为董事长,每个节点可以有多个子节点,表示下属。每一层代表一个等级分布。

  • addPerson: 添加人员功能通过查找指定上司节点,然后将新的人员作为其子节点添加。
  • deletePerson: 删除人员功能首先查找要删除人员的直接上司节点,然后从其子节点中删除该人员。
  • updatePersonInfo: 更新人员信息功能通过查找指定人员节点,然后更新其信息。
  • traversePersons: 遍历人员信息功能采用前序遍历方式,递归地遍历整个人员树。
  • levelOrderTraversal: 按照职位进行层序遍历,以便展示不同职位的人员信息。
  • searchPerson: 按照姓名进行搜索,采用递归方式在整个树中搜索指定姓名的人员节点。
  • searchPosition: 按照职位进行搜索,返回指定职位的所有人员节点列表。
  • main方法:在主函数中实现了用户交互功能,用户可以选择不同的功能编号来执行相应的操作。

2. 功能演示 
 

研究以二叉树为例(人员个数及权值自定义),实现以下任务:

  1. 采用树的孩子兄弟链表等存储结构;
  2. 实现在人事关系树中查找、添加、删除人员功能;
  3. 创建树结构;
  4. 通过深度优先遍历搜索;
  5. 通过层次优先遍历搜索;
  6. 采用Java语言编写代码实现,并撰写实验报告。

【实验思路】  

使用B树来表示人事管理系统,其中每个节点代表一个人员,树的根节点为董事长,每个节点可以有多个子节点,表示下属。每一层代表一个等级分布。

  • addPerson: 添加人员功能通过查找指定上司节点,然后将新的人员作为其子节点添加。
  • deletePerson: 删除人员功能首先查找要删除人员的直接上司节点,然后从其子节点中删除该人员。
  • updatePersonInfo: 更新人员信息功能通过查找指定人员节点,然后更新其信息。
  • traversePersons: 遍历人员信息功能采用前序遍历方式,递归地遍历整个人员树。
  • levelOrderTraversal: 按照职位进行层序遍历,以便展示不同职位的人员信息。
  • searchPerson: 按照姓名进行搜索,采用递归方式在整个树中搜索指定姓名的人员节点。
  • searchPosition: 按照职位进行搜索,返回指定职位的所有人员节点列表。
  • main方法:在主函数中实现了用户交互功能,用户可以选择不同的功能编号来执行相应的操作。

【实验步骤与实验结果】

  1. 默认初始化自动添加7个员工信息

代码

运行结果

  1. 查找员工的直属上司
  2. 按照名称查找员工信息


运行结果:

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("请输入有效的功能编号。");
            }
        }
    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 11中轻松显示休眠菜单的方法

在Windows 11中显示 眠菜单的方法 打开控制面板&#xff1a; 找到电源选项&#xff1a; 选择电源按钮的功能&#xff1a; 更改当前不可用的设置&#xff1a; 勾选休眠选项&#xff1a; 保存更改&#xff1a; 查看休眠选项&#xff1a; 如果以上步骤中未发现休眠选项&…

C++ 01 之 hello world

c01helloworld.cpp #include <iostream>using namespace std;int main() {cout << "hello world" << endl;return 0; } #include<iostream>; 预编译指令&#xff0c;引入头文件iostream.using namespace std; 使用标准命名空间cout <&l…

Golang 百题(实战快速掌握语法)_1

整形转字符串类型 实验介绍 本实验将展示三种方法来实现整形类型转字符串类型。 知识点 strconvfmt Itoa 函数 代码实例 Go 语言中 strconv 包的 itoa 函数输入一个 int 类型&#xff0c;返回转换后的字符串。下面是一个例子。 package mainimport ("fmt"&qu…

el-select filterable模糊搜索在iOS手机上无法弹出软键盘,解决方案

前提&#xff1a; el-select filterable模糊搜索在iOS手机上无法弹出软键盘&#xff0c;在手机上使用时&#xff0c;iOS手机&#xff0c;该组件无法唤起软键盘&#xff0c;导致没法进行模糊搜素。 于是。开始去找原因&#xff0c;发现主要是因为 组件中&#xff0c;input上有一…

分析GIS在疾病传播模型和公共卫生决策中的作用

在这个全球化日益加深的时代&#xff0c;疾病的跨国界传播成为全球公共卫生面临的重大挑战。地理信息科学&#xff08;GIS&#xff09;作为一门集成了空间数据采集、处理、分析及可视化的技术体系&#xff0c;在公共健康领域展现出其不可替代的价值。本文旨在深入探讨GIS如何助…

「面试必看」JS百题斩~ 原型 与 原型链

什么是原型&#xff0c;为什么需要原型 原型的强大之处在于&#xff0c;如果一组属性应该出现在每一个实例上&#xff0c;那我们就可以重用它们——尤其是对于方法。如下例子&#xff1a; function User(name,age){this.name name;this.age age;this.sayHi function(){con…

Linux命令-⽤户、权限管理

目录 <1>查看当前⽤户&#xff1a;whoami <2>查看登录⽤户&#xff1a;who <3>退出登录账户&#xff1a; exit <4>添加⽤户账号&#xff1a;useradd <5>设置⽤户密码&#xff1a;passwd <6>删除⽤户&#xff1a;userdel <7>切换⽤户…

【数据结构】双向链表(C语言)

哈喽铁子们&#xff0c;这里是博主鳄鱼皮坡。这篇文章将分享交流双向链表的相关知识&#xff0c;下面正式开始。 1. 双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严 谨&#xff0c;但是为了老…

【教程】DGL单机多卡分布式GCN训练

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ PyTorch中的DDP会将模型复制到每个GPU中。 梯度同步默认使用Ring-AllReduce进行&#xff0c;重叠了通信和计算。 示例代码&#xff1a; 视频&#xff1…

C++怎么根据变量名称返回变量的值?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 有点好奇你这么做是为了什么。…

[Redis] Redis Desktop Manager 安装包和连接和创建流程

1. 安装流程就是next&#xff0c;就可以。 2. 分别填写好&#xff1a; Name(自定义&#xff0c;redis这个库展示的名字), Host, Port, Auth(Redis 的连接password) 3. 要勾选上Use SSL Protocol 选项&#xff0c; 4. 连接到redis上&#xff0c;展示不同的database&#xff0c;…

cad标注尺寸很简单,这三个方法很好掌握!

在CAD&#xff08;计算机辅助设计&#xff09;的广阔领域中&#xff0c;标注尺寸是至关重要的一环。无论是初入CAD领域的新手&#xff0c;还是经验丰富的设计师&#xff0c;掌握标注尺寸的技巧都是提升工作效率和准确性的关键。今天&#xff0c;我们就来分享三个简单而实用的方…

AIGC数字人视频生成解决方案,赋能广电电视内容生产

AI数字人可以有效加大人工智能在内容生产的应用&#xff0c;推动广电电视节目创意生产&#xff0c;提高生产效率的同时&#xff0c;还能提升节目质量&#xff0c;增强互动呈现&#xff0c;为观众提供更加精彩的视听产品。 广州虚拟动力作为3D、AI数字人技术服务商及方案提供商…

5款非常好用的小众软件,你值得拥有

​ 今天为大家推荐五款不常见但好用的win10软件&#xff0c;它们都有着各自的特色和优势&#xff0c;相信你会喜欢的。 1. 文件夹查看——Folder Size View ​ Folder Size View是一款高效的文件夹大小查看工具&#xff0c;它能够快速扫描并展示文件夹及其子文件夹的占用空间…

np.array()按权重求平均值详解

代码如下&#xff1a; a np.array([[1, 4, 2, 6],[10, 41, 7, 3],[9, 1, 6, 2]]) v1 np.average(a, weights[3, 3, 4], axis0) print(v1) 运行结果 当执行这段代码时&#xff0c;np.average(a, weights[3, 3, 4], axis0)会根据指定的权重在列方向上计算加权平均值。 具体计…

告别枯燥:Python数据处理也可以很有趣

想要成为数据处理的超级英雄吗&#xff1f;阿佑将带你一探究竟&#xff01;我们将深入数据村&#xff0c;学习如何使用Python的超能力处理各种复杂的数据格式。从解码错误和字符集问题的解决&#xff0c;到大数据量的性能优化&#xff0c;再到数据验证与清洗&#xff0c;每一个…

git clone 项目报“鉴权失败”的解决办法

#问题展示# git clone https://gitee.com/soaringsoft/.....git 正克隆到...... Username for https://gitee.com:...... Password for https://.....gitee.com:...... remote: [session-1440f183] Unauthorized fatal: git clone https://gitee.com/soaringsoft/.....gi…

SpringMVC框架学习笔记(七):处理 json 和 HttpMessageConverter 以及文件的下载和上传

1 处理 JSON-ResponseBody 说明: 项目开发中&#xff0c;我们往往需要服务器返回的数据格式是按照 json 来返回的 下面通过一个案例来演示SpringMVC 是如何处理的 &#xff08;1&#xff09; 在web/WEB-INF/lib 目录下引入处理 json 需要的 jar 包&#xff0c;注意 spring5.x…

推荐网站(22)GeoSpy,根据图片显示地理位置

今天推荐一款名为GeoSpy的AI工具。它利用人工智能技术&#xff0c;通过分析照片中的光线、植被、建筑风格等细节线索&#xff0c;实现对拍摄地点的精确定位。令人难以置信的是,它对位置的定位准确度非常高。 GeoSpy之所以智能如此,是因为它将输入的照片与大量的街景和地理图像…

夹层辊能否解决智能测径仪量程不足的问题?

关键字:智能测径仪,测径仪夹层辊,测径仪量程,夹层辊作用,测径仪量程不足, 智能测径仪是一种高精度的测量设备&#xff0c;主要用于检测线材、管材等圆柱形物体的直径尺寸。在测径仪中&#xff0c;夹层辊是测径仪的关键部件之一&#xff0c;它负责引导和支撑被测物体&#xff0c…