公司那些事——用链表建父兄二叉树及操作

本文介绍了一种使用C++实现的员工管理树形结构。该结构支持员工的雇佣与解雇操作,并通过先序遍历查找指定员工。此外,文章还提供了一个简单的打印功能来展示树形结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;

typedef struct Tree
{
    int depth;
    string name;
    Tree* fa;
    Tree* son;
    Tree* bro;
}Tree;
Tree* company = new Tree;
Tree* sear;
int flag;

void Clear(Tree* p,int depth)
{
    p->bro = NULL;
    p->fa = NULL;
    p->son = NULL;
    p->depth = depth;
}
void Search2(Tree* node,string employer)//先序遍历
{
    if (flag == 1) return;
    if (node != NULL) {
        if (node->name == employer) {
            sear = node; flag = 1;
        }
        Search2(node->son,employer);
        Search2(node->bro,employer);
    }
}
Tree* Search(string employer)//初始化search指针,再用Search()全部遍历(时间可能有点可惜,不过怎么才能中途停止递归呢?flag就可以)
{
    flag = 0;//还没找到
    sear = NULL;
    Search2(company,employer);
    return sear;
}

void Hire(string employer,string staff)
{
    Tree* nodee = Search(employer);
    Tree* nodes = new Tree;
    Clear(nodes, nodee->depth + 1);
    Tree* node2;//第三种情况用来记录上一个bro
    Tree* node = nodee->son;
    nodes->fa = nodee;
    //nodes->depth = nodee->depth + 1;
    nodes->name = staff;
    if (node == NULL) {//分三种情况 1ee无子 2ee只有一个儿子 3ee有多子(es有兄弟)
        nodee->son = nodes;
    }
    else if (node->bro == NULL) {
        node->bro = nodes;
    }
    else {
        node2 = node;
        node = node->bro;
        while (node != NULL) {
            node = node->bro;
            node2 = node2->bro;
        }
        node2->bro = nodes;
    }

}

void Fire(string staff)
{
    Tree* node = Search(staff);
    Tree* node2;
    if (node->son == NULL && node->bro == NULL) {//三种情况 1无子无兄弟 2无子有兄弟 3有子
        node2 = node->fa->son;//还是得从父亲那里遍历过去,它只是在边缘,上面可能还有兄弟(父亲可能不止一个儿子),不可直接剪son!
        node = node2->bro;
        while (node != NULL && node->bro != NULL) {
            node = node->bro;
            node2 = node2->bro;
        }
        if (node == NULL) node2->fa->son = NULL;//父亲只有一子
        else node2->bro = NULL;//父亲多子
    }
    else if (node->son ==NULL) {
        node2 = node->fa->son;//还是得从父亲那里遍历过去,它只是在正下或中间
        node = node2->bro;
        while (node2->name != staff && node->name != staff) {
            node = node->bro;
            node2 = node2->bro;
        }
        if (node->name == staff) node2->bro = node->bro;
        else if (node2->name == staff) node2->fa->son = node;
    }
    else {
        node2 = node;
        node = node->son;
        while (node != NULL) {
            node2->name = node->name;
            node2 = node2->son;
            node = node->son;
        }
        node2->fa->son = node2->bro;
    }
}

void Print(Tree* node)
{
    if (node != NULL) {
        for (int i = 1; i <= node->depth; i++) {
            cout << '+';
        }
        cout << node->name << endl;
        Print(node->son);
        Print(node->bro);
    }
}

int main()
{    
    string name, op, employer, staff;
    Clear(company,0);
    cin >> name;
    company->name = name;
    while(cin >> employer) {
        if (employer != "print") {
            if (employer != "fire") {//hires
                cin >> op >> staff;
                Hire(employer,staff);
            }
            else {//fire
                cin >> staff;
                Fire(staff);
            }
        }
        else {
            Print(company);
            printf("------------------------------------------------------------\n");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值