数据结构考试测试编程题

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


左叶子之和

左叶子之和
在这里插入图片描述
思路:我们要遍历一遍二叉树,找到左右子树的左节点之和加起来

int sumOfLeftLeaves(struct TreeNode* root ) 
{
    if(root == NULL)
        return 0;
    if(root->left == NULL && root->right == NULL)
        return 0;
    //判断该节点是否有左节点
    if(root->left!=NULL && root->left->right == NULL && root->left->left==NULL)
        return root->left->val + sumOfLeftLeaves(root->right);
    return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
}

思路解释图:
在这里插入图片描述
先判断根节点是否为NULL.判断是否没有左右孩子,如果有判断左孩子是否是叶子节点,是的话就存起来这个值,加上右子树的左叶子节点 的值

环形链表的约瑟夫问题

环形链表的约瑟夫问题
在这里插入图片描述
思路:构造一个环形单向循环链表,每走n次,就删除对应的节点,然后直到剩下一个节点

链接:https://www.nowcoder.com/questionTerminal/c3b34059faf546d3a7ee28f2b0154286?toCommentId=18647662
来源:牛客网

#include <stdio.h>
#include<stdlib.h>
typedef int SDataType;
typedef struct StackNode {
    SDataType val;
    struct StackNode* next;
} StackNode;
typedef struct Stack {
    StackNode* head;
    int size;
} Stack;
//创建节点
StackNode* CreateNode(SDataType elemest) {
    //创建
    StackNode* new = (StackNode*)malloc(sizeof(StackNode));
    if (new == NULL) {
        perror("CreateNode");
        return NULL;
    }
    new->next = NULL;
    new->val = elemest;
    return  new;
}
//初始化
void StackInit(Stack* root) {
    root->head = NULL;
    root->size = 0;
}
//插入
void StackPush(StackNode** head, SDataType elemest) {
    //创建
    StackNode* newnode = CreateNode(elemest);
    if (*head == NULL) {
        *head = newnode;
        newnode->next = *head;
    } else {
        StackNode* tail = *head;
        while (tail->next != *head) {
            tail = tail->next;
        }
        tail->next = newnode;
        newnode->next = *head;
    }
}
//删除
void StackPop(StackNode** head, StackNode* node) {
    if (head == NULL)
        return;
    if (*head == node) {
        StackNode* tail = (*head)->next;
        while (tail->next != *head) {
            tail = tail->next;
        }
        *head = (*head)->next;
        tail->next = *head;
        free(node);
        return;
    }
    StackNode* tail = (*head)->next;
    while (tail != *head) {
        if (tail->next == node)
            break;
        tail = tail->next;
    }
    tail->next = node->next;
    free(node);

}
//释放
void StackDestoy(StackNode* head) {
    StackNode* tail = head->next;
    while (tail != head) {
        StackNode* p = tail->next;
        free(tail);
        tail = p;
    }
}
int main() {
    //
    Stack* root = (Stack*)malloc(sizeof(Stack));
    //初始化
    StackInit(root);
    int n = 0;
    scanf("%d", &n);
    int i = 1;
    for (i = 1; i <= n; i++) {
        //插入
        StackPush(&(root->head), i);
        root->size++;

    }
    //
    int m = 0;
    scanf("%d", &m);
    int count = 1;
    StackNode* tail = root->head;
    while (root->size != 1) {
        if (count == m) {
            root->size--;
            count = 0;
            //删除
            StackNode* p = tail->next;
            StackPop(&(root->head), tail);
            tail = p;
            count++;
        } else {
            count++;
            tail = tail->next;
        }
    }
    printf("%d", root->head->val);
    StackDestoy(root->head);
    free(root);
    return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老秦包你会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值