A研
考研数据结构
江冷易水寒
人终会被年少不可得之物困扰一生。
展开
-
设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有结点的左、右子树进 行交换的函数
思路:递归,自下而上交换代码: TreeNode* mirrorTree(TreeNode* root) { if(root){ mirrorTree(root->left); mirrorTree(root->right); TreeNode* temp = root->left; root->left = root->right;原创 2020-08-31 08:55:10 · 862 阅读 · 2 评论 -
试给出二叉树的自下而上,自右而左的层次遍历算法
封装好的二叉树各种操作的代码:#include“initList/initTree.h“思路:用正常的层次遍历算法,唯一区别就是变为逆向输出,很容易联想到栈,可以将输出语句改为压栈语句,等层次遍历完之后再输出栈元素,即为结果。思考:如果要求层次遍历自上而下,自右向左输出,该如何实现?代码://层次遍历 下自上,右自左void layerR_LVisit(BiTree T){ BiTree p = T; stack<BiTree> s; queue<原创 2020-08-28 21:48:44 · 2166 阅读 · 0 评论 -
#include“initList/initTree.h“
#include<iostream>#include<stack>#include<queue>using namespace std;typedef char ElementTYPE;//结构体定义typedef struct Node{ ElementTYPE data; struct Node *lchild; struct Node *rchild;}BinaryTree,*BiTree;class initTree.原创 2020-08-28 21:43:44 · 308 阅读 · 0 评论 -
有两个循环单链表,链表头指针分别为h1和h2,编写一个函数将链表h2链接到链表 h1之后,要求链接后的链表仍保持循环链表形式。
代码:LinkList* connectList(LinkList* L1,LinkList* L2){ //L1尾接到L2头,L2尾接到L1头 LinkList* p1 = L1->next; LinkList* p2 = L2->next; while(p1->next!=L1) p1 = p1->next; p1->next = L2;//L1尾接到L2头节点 while(p2->next!=L2原创 2020-08-22 20:42:51 · 2166 阅读 · 0 评论 -
设有一个带头结点的循环单链表,其结点值均为正整数。试设计一个算法,反复找出单链表中结点值最小的结点,并输出之,然后将该结点从中删除,直到单链表空为止,最后再删除表头结点
代码:void circular(LinkList* L){ LinkList* head = L; while(L->next != NULL){ LinkList* p = L->next; LinkList* pre = L; LinkList* min = p; LinkList* minpre = pre; while(p != head){ if(min->da原创 2020-08-21 21:18:22 · 2425 阅读 · 0 评论 -
设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并成一个案元素递减有序的单链表C
代码:LinkList* commonElem(LinkList* L1,LinkList* L2){ LinkList* L = new LinkList; LinkList* rear = L; LinkList* p1 = L1->next; LinkList* p2 = L2->next; while(p1!=NULL && p2!=NULL){ //如果相同,尾插法插入链表L if(p1-&g原创 2020-08-21 19:59:11 · 7950 阅读 · 5 评论 -
假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
代码:void mergeList(LinkList* L1,LinkList* L2){ //将L2插入到L1中 LinkList* p = L1->next;; LinkList* p2 = L2->next;; L1->next = NULL; //头插法 while(p!=NULL && p2!=NULL){ if(p->data>p2->data){ /原创 2020-08-20 21:13:50 · 5885 阅读 · 6 评论 -
设C = {a1,b1,a2,b2......,an,bn},采用头结点的hc单链表来存放, 设计一个就地算法,将其拆成 A = {a1,a2....a2} B = {bn,bn-1,...b1}
代码:void split(LinkList* L){ LinkList* L1 = L;//如果将A分成两个链表 B和C则 new LinkList;;//odd LinkList* L2 = new LinkList;//even LinkList* p; LinkList *rear1 = L1;; p = L->next;// work next pointer L2->next =NULL; int counter = 1原创 2020-08-19 20:51:16 · 1829 阅读 · 1 评论 -
设计一个算法将一个带头结点的单链表A分解成两个带头结点的单链表A和B使A中含有原链表中序号为奇数的元素而B中含有原链表中序号为偶数的元素并且保持元素原有的相对顺序
代码:void split(LinkList* L){ LinkList* L1;//odd LinkList* L2;//even LinkList* p; LinkList *rear1,*rear2; p = L->next;// work next pointer L1 = L;//如果将A分成两个链表 B和C则 new LinkList; L2 = new LinkList; rear1 = L1,rear2 = L2;原创 2020-08-19 20:26:13 · 6084 阅读 · 0 评论 -
给定一个带表头结点的单链表,设head为头指针, data 为整型元素, next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素, 并释放结点所占的存储空间
代码:void sortDel(LinkList* L){ LinkList *p,*pre,*minp,*minpre; LinkList* temp; while(L->next!=NULL){ p = L->next; pre = L; minpre = pre; minp = p; while(p!=NULL){ if(p->data < mi原创 2020-08-19 19:08:42 · 5969 阅读 · 1 评论 -
在一个带表头结点单链表中所有元素结点数据值无序排列,删除表中所有介于给定两个值之间的元素的元素(若存在)
代码:#include"initList/initList.h"void delRandX_Y(LinkList* L,TypeData x,TypeData y){ LinkList* p; LinkList* pre; p = L->next; pre = L; LinkList* temp; if(L == NULL || L->next == NULL) return ; while(p!=NULL){原创 2020-08-18 18:23:31 · 1182 阅读 · 0 评论 -
试编写在带头结点的单链表1中删除一个最小值结点的高效算法(假设最小值结点是唯一的)
#include"initList/initList.h"LinkList* del_min(LinkList* L){ LinkList* pre;//前驱节点 LinkList* p;//工作节点 LinkList* minpre;//最小值前驱节点 LinkList* min;//最小值节点 pre = L,minpre = pre; p = L->next,min = p; if(p==NULL) return ...原创 2020-08-17 20:26:10 · 4922 阅读 · 3 评论 -
#include“initList/initList.h“
#include<iostream>#include<vector>#include<ctime>using namespace std;typedef int Element;typedef int TypeData;typedef int ElemType;//结构体typedef struct Node{ Element data; struct Node *next;}LinkList;//初始化链表,带头节点,尾插法Li.原创 2020-08-17 20:22:49 · 2240 阅读 · 0 评论 -
设l为带头结点的单链表,编写算法实现从尾到头反向输出
思路:方法一:将链表压栈再输出,时间复杂度为O(n),空间复杂度为O(n)方法二:用头插法重新建立单链表在输出,时间复杂度为O(n),空间复杂度为O(1)方法三:用递归,本质上也用到了栈,所以空间复杂度为O(n),时间复杂度为O(n)代码:#include<iostream>#include"initList/initList.h"#include<stack>using namespace std;// 方法一:用栈void reversePrin原创 2020-08-06 18:31:19 · 8132 阅读 · 6 评论 -
王道:在带头结点的单链表L中,删除所有值为X的结点,并释放其空间,假设值为X的结点不唯一,试编写算法以实现上述操作
思路:设置两个节点pre和p,分别用来记录链表L的前驱节点和当前节点,当找到数据X时,将pre指向p的下一个节点,p移动到p的下一个节点(因为p将要被释放),如下图:代码:void del_x(LinkList* L,int x){ LinkList* p = L->next; LinkList* pre = L; while(p != NULL){ if(p->data == x){ LinkList* q = p;原创 2020-08-05 19:35:04 · 2713 阅读 · 1 评论 -
编写取线性表的中间数序元素的算法
分析:设置两个指针,一个快指针,一个慢指针,当快指针遍历完链表后,慢指针所指向的位置即为链表的中间位置。时间复杂度:O(n)Element fetchMidst(LinkList* L){ LinkList* pace_1 = L;//慢 LinkList* pace_2 = L;//快 while(pace_2->next!=NULL){ pace_2 = pace_2->next->next; pace_1 = pace原创 2020-07-08 15:34:08 · 280 阅读 · 1 评论 -
已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。
已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。时间复杂度:O(min(m,n))LinkList* connect(LinkList *ha,LinkList *hb,int m,int n){ LinkList *hc,*rear; if(m>n){ hc = ha;原创 2020-07-08 14:06:13 · 8000 阅读 · 4 评论 -
试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)
空间复杂度为O(1)时间复杂度为O(n)算法:#include"initList.h"LinkList* reverse(LinkList* L){ LinkList *p; p = L->next; L->next = NULL; while(p!=NULL){ LinkList* temp = (LinkList*)malloc(sizeof(LinkList*));//保持不断链 temp = p->原创 2020-07-07 17:33:58 · 3961 阅读 · 0 评论 -
已知线性表中的元素以值递增有序排列,并以单链表做存储结构。试写一高效的算法, 删除表中所有值大于 mink 且小于 maxk 的元素
时间复杂度为:O(n)#include<iostream>#include<stdio.h>using namespace std;typedef int Element;typedef struct Node{ Element data; struct Node *next;}LinkList;//初始化链表,带头节点,头插法LinkList* init_headInsert(){ LinkList *list,*head;原创 2020-07-06 20:23:02 · 9060 阅读 · 1 评论 -
设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性
#include<stdio.h>#include<iostream>using namespace std;#define max_size 20typedef int Status;typedef int Element;typedef struct{ /* data */ Element elem[max_size]; int listsize = max_size; int length;}Sqlist;Sqlist ad.原创 2020-07-06 16:13:02 · 2637 阅读 · 0 评论