基于二叉排序树的员工信息管理系统

来源:互联网 发布:剑网3丐哥捏脸数据 编辑:程序博客网 时间:2024/05/16 23:42

这学期因为“数据结构”这门课程的课程设计要求,用Java语言做了一个基于二叉排序树的简单的员工信息管理系统。
因为课程设计要求运用数据结构知识来做出一个成品,经过考虑后采用二叉排序树来设计一个员工信息管理系统。整个设计用了大约七天时间完成,系统界面比较简陋,功能也是比较简单。

一、实现的界面如下:

这里写图片描述

这里写图片描述

这里写图片描述

二、实现的功能如下:

  • 权限控制。账户分为管理员账户和普通账户,两者拥有不同的权限,从而保障了管理系统的信息安全。管理员的账号名与密码均为:admin,普通用户的账号名与密码均为:user
  • 信息查询。可以指定查询条件对信息进行检索,得到的信息以表格形式呈现,且按工号大小排列
  • 信息增添。可以向管理系统添加新的员工信息,而每个员工的工号是其唯一标识,均为大于零整数且不可重复
  • 信息修改。可以向系统中已经保存的员工信息进行修改,但其工号不可以修改
  • 信息删除。可以删除系统中的员工信息,则其工号可以被下一个新的员工使用

三、数据结构的设计

  • 每个员工的属性有姓名、性别、部门、电话、职务、工号、备注等七项,因此我创建了一个Employees类来表示员工信息,用集合List< Employees>来存储所有的员工信息
  • 为了将员工信息组织起来且获得较高的检索效率,我采用了二叉排序树来构建数据模型,以每个员工的工号大小来作为构建二叉排序树时的标识符
  • 二叉排序树的每个结点BitreeNode拥有四个属性:代表员工信息的Employees类型的的oneself,BitreeNode类型的结点的双亲结点parent,BitreeNode类型的结点的左孩子lchild,BitreeNode类型的结点的右孩子rchild
  • 当查询所有员工信息时,数据是按工号大小排序的。而根据二叉排序树的结构特点,当对其进行中序遍历时即可得到排序结果。程序中提供了中序遍历InOrder算法。当指定查询条件为“工号”时,我设计了查找算法Search来查找对应的员工信息
  • 当增添员工信息时,即是在原二叉排序树的基础上进行插入操作。在程序中提供了插入算法insert(BiTreeNode root, Employees item); root是原二叉排序树,item是要插入的员工信息
  • 当修改员工信息时,可以通过查找算法Search来找到相应结点从而修改员工信息,但因为二叉排序树是根据员工信息集合List< Employees>来构建的,修改了二叉排序树后也要再来修改List< Employees>,效率低且没有必要。因此在修改算法Revise中我直接对List< Employees>进行修改操作,然后再通过插入算法insert(BiTreeNode root, Employees item)重新构建一个新的二叉排序树
  • 当删除员工信息时,与修改操作一样可以通过直接操作List< Employees>来构建新的二叉排序树,这样操作简单且效率高。但因为在删除二叉排序树某个结点时,要考虑该结点是叶子结点、左右孩子均存在或者两者存一三种情况,算法较为复杂而且比较有锻炼意义。因此本课程设计中我依然保留了二叉排序树结点删除算法Delete,在结点删除后我再对List< Employees>进行了相应的删除操作。

四、整个工程的代码设计如下:

这里写图片描述

想要构建一个二叉排序树,就需要一步步地来设计结点构造与结点信息。我为每个员工设计的信息有以下几种:

    // 名字    private String name;    // 性别    private String sex;    // 部门    private String section;    // 电话    private String tel;    // 职务    private String post;    // 工号    private int id;    // 备注    private String note;

二叉排序树的结点除了要包含员工信息外,还需要包含结点本身在二叉排序树中的结构信息:

    // 员工的各项信息    private Employees oneself;    // 结点的双亲    private BiTreeNode parent;    // 结点的左孩子    private BiTreeNode lchild;    // 结点的右孩子    private BiTreeNode rchild;

我将所有员工信息集合存放在:public static List< Employees> all当中,这样我们就可以运用二叉排序树的插入算法来构建二叉排序树了,增添员工信息实际上就是向all增添信息,随后再来构建新的二叉排序树:

    /*     * 二叉排序树插入算法 ,item是要插入的员工信息, root是二叉排序树     * “员工的工号不能相同且要大于零”这个条件已经在PanelIncrease限制     */    private void insert(BiTreeNode root, Employees item) {        /*         * 因为二叉排序树根结点已经初始化,所以不必考虑二叉排序树为null的情况         */        if (item.getId() < root.getOneself().getId()) {            if (root.getLchild() == null) {                BiTreeNode temp = new BiTreeNode(item);                root.setLchild(temp);                root.getLchild().setParent(root);            } else {                insert(root.getLchild(), item);            }        } else if (item.getId() > root.getOneself().getId()) {            if (root.getRchild() == null) {                BiTreeNode temp = new BiTreeNode(item);                root.setRchild(temp);                root.getRchild().setParent(root);            } else {                insert(root.getRchild(), item);            }        }    }

删除员工信息也与增添操作类似,都是对all进行删添,随后构建新的二叉排序树。
查询面板中JTable对所有员工信息进行了排序,排序依据员工工号大小,根据二叉排序树的结构特点,对二叉排序树进行中序遍历即可得到排序结果:

这里写图片描述

// 中序遍历二叉排序树    private void inorder(BiTreeNode tree) {        if (tree != null) {            inorder(tree.getLchild());            str.add(new Employees(tree.getOneself().getName(), tree                    .getOneself().getSex(), tree.getOneself().getSection(),                    tree.getOneself().getTel(), tree.getOneself().getPost(),                    tree.getOneself().getId(), tree.getOneself().getNote()));            inorder(tree.getRchild());        }    }

Panel包中有三个类,分别是PanelIncrease,PanelInquiry,PanelUser,功能分别是管理员账户增添面板,管理员账户功能面板,普通用户查询面板。因为Frame包中的FrameAdmin类是管理员账户窗口,当中建立了一个JTabbedPane,则需要为之增添“增添”和“查询”两个选项卡面板,代码如下:

    // 选项窗格    private JTabbedPane createTabPanel() {        JTabbedPane jtp = new JTabbedPane();        jtp.addTab("      增添               ", new PanelIncrease());        jtp.addTab("      查询               ", new PanelInquiry());              return jtp;    }

源代码下载:基于二叉排序树的员工信息管理系统

1 0
原创粉丝点击