数据结构考试测试编程题

简介: 数据结构考试测试编程题

左叶子之和

左叶子之和

思路:我们要遍历一遍二叉树,找到左右子树的左节点之和加起来

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;
}
相关文章
|
4月前
|
存储 测试技术
LabVIEW编程开发PCB自动测试设备
LabVIEW编程开发PCB自动测试设备
41 1
|
13天前
|
IDE Java 测试技术
揭秘Java高效编程:测试与调试实战策略,让你代码质量飞跃,职场竞争力飙升!
【8月更文挑战第30天】在软件开发中,测试与调试对确保代码质量至关重要。本文通过对比单元测试、集成测试、调试技巧及静态代码分析,探讨了多种实用的Java测试与调试策略。JUnit和Mockito分别用于单元测试与集成测试,有助于提前发现错误并提高代码可维护性;Eclipse和IntelliJ IDEA内置调试器则能快速定位问题;Checkstyle和PMD等工具则通过静态代码分析发现潜在问题。综合运用这些策略,可显著提升代码质量,为项目成功打下坚实基础。
33 2
|
21天前
|
存储 测试技术 数据库
Python接口自动化测试框架(练习篇)-- 函数编程(一)
本文通过实际的编程练习,讲解了面向过程编程的概念和应用,包括如何定义函数、处理文件读写以及实现用户注册功能,最终将这些过程封装成函数,体现了Python作为脚本语言的面向过程编程特性。
14 2
|
21天前
|
测试技术 Python
Python接口自动化测试框架(练习篇)-- 函数编程(二)
本文通过具体的编程练习,深入探讨了Python中的函数编程,包括如何定义函数、使用参数和返回值,以及函数式编程的技巧和应用,如使用lambda表达式和递归函数解决实际问题。
14 1
|
1月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
49 7
|
2月前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。
40 6
|
2月前
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决
|
2月前
|
算法 程序员 计算机视觉
Python并查集:数据结构界的肌肉男,让你在编程路上无所畏惧!
【7月更文挑战第16天】并查集,一种处理不相交集合合并与查询的数据结构,被誉为编程的“肌肉男”。它提供Find(找根节点)和Union(合并集合)操作,常用于好友关系判断、图像处理、集合合并等。Python实现中,路径压缩和按秩合并优化效率。并查集的高效性能使其成为解决问题的强大工具,助力程序员应对复杂挑战。
40 0
|
2月前
|
安全 调度 Python
Python堆与优先队列:不只是数据结构,更是你编程路上的超级加速器!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能。堆,作为完全二叉树,支持排序性质,heapq用于单线程操作;PriorityQueue在多线程中保证安全。通过示例展示了如何插入、删除任务,以及在多线程任务调度中的应用。堆与优先队列是高效编程的关键工具,提升代码性能与并发处理能力。
22 0
|
3月前
|
算法 Linux 测试技术
Linux编程:测试-高效内存复制与随机数生成的性能
该文探讨了软件工程中的性能优化,重点关注内存复制和随机数生成。文章通过测试指出,`g_memmove`在内存复制中表现出显著优势,比简单for循环快约32倍。在随机数生成方面,`GRand`库在1000万次循环中的效率超过传统`rand()`。文中提供了测试代码和Makefile,建议在性能关键场景中使用`memcpy`、`g_memmove`以及高效的随机数生成库。