数据结构
文章平均质量分 50
大大da怪i
漫无目的
展开
-
己知一棵有 2011 个结点的树,其叶结点个数为 116,该树对应的二叉树无右孩子的结点个数是
树转二叉树的规则:每个结点左指针指向它的第一个孩子,右指针指向它在树中相邻的右兄弟,即“左孩子右兄弟“。拓展:树中一个叶子节点在转化为二叉树的时候,如果它有右兄弟,那么它右指针会指向其兄弟节点,此时该叶子节点不再是叶子节点;如果他没有兄弟节点,转化后仍然是叶子节点。(即不论哪种情况,该节点都没有左孩子。树转化成二叉树的画法:①在兄弟结点之间加一连线;②对每个结点,只保留它与第一个孩子的连线,而抹掉与其他孩子的连线;③以树根为轴心,顺时针旋转45°。原创 2023-10-24 19:31:33 · 256 阅读 · 0 评论 -
判断一条链表中有无环路
两种链表一、普通单链表二、有环链表问题:判断一条链表中是否存在环。思路一:哈希存储,通过set集合存储遍历过的结点,遍历过程中检查set,若set中已存在某节点,则证明有环,返回true,若遍历正常结束,最终返回false,无环。(该方法易实现,此处略写。)思路二:双指针、快慢指针,设置一个fast指针和slow指针,slow每次移动一次(slow = slow.next),fast 每次移动两次(fast = fast.next.next)。若存在环,fast指针先进入环内循环,sl原创 2021-05-14 09:29:44 · 218 阅读 · 4 评论 -
寻找单链表的中间项
问题:寻找一条单链表中的中间项的值。链表结构体typedef struct Node{ int value; struct Node* next;}*Link;思路:使用快慢指针,设置两个指针(slow,fast)分别指向链表第一项,slow每次移动一次(slow = slow.next) ,fast 每次移动两次(fast = fast.next.next),当fast遍历完整条链表后,slow的位置即是中间项的位置。动画模拟:代码实现:int findMid(原创 2021-04-24 15:24:53 · 207 阅读 · 0 评论 -
自测-3 数组元素循环右移问题(一遍懂,两种方法)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯A**N−1)变换为(A**N−M⋯A**N−1A0A1⋯A**N−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式:每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不原创 2021-02-05 22:24:48 · 1624 阅读 · 0 评论 -
头插法和尾插法总结(动图版)
代码使用结构体:typedef struct Node{ int value; struct Node* next;}*Link;头插法:利用头指针控制链表节点的增加。核心:newNode->next = head->next;head->next = newNode;//头插法创建链表Link headCreateLink(int n){ //头指针初始化部分 Link head,newNode; head = (Link)malloc(sizeo原创 2021-02-03 22:44:58 · 31764 阅读 · 14 评论 -
7-52、两个有序链表序列的交集
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。输入样例:1 2 5 -12 4 5 8 10 -1输出样例:2 5一开始用Java写了两遍,都无法全部通过,最后一个样例不是运行超时就是内存超限,有用Java通过的小伙伴原创 2021-02-02 20:49:06 · 487 阅读 · 1 评论 -
6-7 在一个数组中实现两个堆栈 (20分)
本题要求在一个数组中实现两个堆栈。函数接口定义:Stack CreateStack( int MaxSize );bool Push( Stack S, ElementType X, int Tag );ElementType Pop( Stack S, int Tag );其中Tag是堆栈编号,取1或2;MaxSize堆栈数组的规模;Stack结构定义如下:typedef int Position;struct SNode { ElementType *Data; Posi原创 2021-02-01 21:05:36 · 133 阅读 · 1 评论 -
(两种方法)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素
为了方便描述过程,假定一个线性表结构体ArrayListtypedef struct ArrayList{ int data[N]; int index;//初始值为-1,代表里面没有元素,使用时代表下标。}*List;第一种方法:顺序双指针法指针i控制向后遍历,指针j记录需要交换的位置。、1、进入循环,当遇到item元素时,不做任何处理,否则将指针i指向的值赋予指针j的位置,且指针j右移2、循环终止,最终将线性表的index等于j-1的位置。(最后一步的index位置,看i原创 2021-01-31 23:15:59 · 12494 阅读 · 6 评论 -
PTA 6-1 单链表逆转 (20分) 三种解法
PTA 6-1 单链表逆转 (20分) 三种解法本题要求实现一个函数,将给定的单链表逆转。函数接口定义:List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */原创 2021-01-08 22:06:29 · 1112 阅读 · 1 评论 -
二叉树相关性质(更新中……)
二叉树的性质(持续更新中……)在二叉树的第i层至多有2^(i-1)个结点(i>=1)(参考满二叉树,数学归纳法证明)深度为k的二叉树至多有2^k-1个结点(k>=1)(满二叉树与等比数列求和)二叉树的深度:一颗树只有一个节点,它的深度是1;根节点只有左子树而没有右子树,那么二叉树的深度应该是其左子树的深度加1;根节点只有右子树而没有左子树,那么二叉树的深度应该是其右树的深度加1;根节点既有左子树又有右子树,那么二叉树的深度应该是其左右子树的深度较原创 2020-07-03 23:23:51 · 300 阅读 · 0 评论 -
数据结构习题:设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有多少个
设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有多少个森林转二叉树:将森林中每棵树转换成相应的二叉树;第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连起来后,此时,所得二叉树即是森林转换得到的。第一步:每棵树转二叉树第二步:二叉树合并二叉树转森林若某结点是其双亲的...原创 2020-04-15 11:07:23 · 30032 阅读 · 35 评论 -
二叉树的中序遍历(两种实现方式)
二叉树的中序遍历(递归与非递归实现)二叉树采用链式存储结构进行保存。二叉树的定义为:typedef struct Node{ ElemType data; //数据元素 struct Node *lchild; //指向左孩子 struct Node *rchild; //指向右孩子}BiTree;中序遍历中序遍历(LDR)是二叉树遍历的一...原创 2020-04-09 10:10:36 · 1339 阅读 · 0 评论 -
二叉树的先序遍历(两种实现)
二叉树的先序遍历(递归与非递归实现) 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树这里采用链式存储结构进行保存。二叉树的定义为typedef struct Node{ ElemType data; //数据元素 struct Node *lchild; /...原创 2020-04-08 15:15:09 · 1502 阅读 · 0 评论 -
初识数据结构(概念篇)
1.1 数据结构是什么数据结构+算法=程序数据结构是计算机存储、组织数据的方式1.2 数据结构基本概念1.2.1 基本概念数据(data):所有能输入到计算机中的描述客观事物的符号数值型数据非数值型数据数据元素(data element):数据的基本单位。(类似于数据库的一条数据(一整行))数据项(data item):独立含义的数据最小单位,也称域...原创 2020-03-05 08:42:31 · 489 阅读 · 0 评论 -
线性表的两种实现(附C与java代码)
2.1 认识线性表线性表的定义:用数据元素的有限序列表示同一线性表中的元素必定具有相同特性。线性表中的数据元素可以为简单类型,也可以为复杂类型线性表基本操作:初始化取值查找插入删除是否为空线性表长度2.2 线性表的顺序存储结构实现(数组实现)C语言中我们定义一个数据结构是通过结构体的定义来实现#define MAXSIZE 100 //定义最大长...原创 2020-03-04 22:14:33 · 385 阅读 · 0 评论