笔试面试--数据结构
==================================链表==================================
1. 找一个链表中倒数第k个结点(假设原链表肯定有多余k个结点)
假设整个链表有x个结点,用两个指针即可找到倒数第k个,示意图如下:
先用一个指针a遍历到第k个 ;然后a、b指针同时开始往后,直到指针a结束,则b在这段时间里走过了x-k个结点,也就是倒数第k个结点
typedef struct { int data; Node *next; }Node; Node *findKthToTail(Node *head,int k) { //假设链表不为空,且有多于k个结点 Node *fast = head; Node *slow = head; for(int i=0;i<k;i++) { if(fast == NULL) { return NULL; } fast = fast->next; } while(fast != NULL) { fast = fast->next; slow = slow->next; } return slow; }
2. 单链表排序
3. 两个单链表求交、并、差
4. 单链表反转
Node是结点结构体类型:有数据域elemType data和指针域Node *next 第一个结点就是有效结点 Node *head = initSingleList(); //.....加入了很多新元素进去 reverseSingleList(&head); //或head = reverseSingleList(&head); Node *reverseSingleList(Node **head) { if(NULL == *head || NULL == (*head)->next) { return *head; } Node *a = *head; Node *b = a->next; Node *c = NULL; (*head)->next = NULL; while(NULL != b) { c = b->next; b->next = a; a = b; b = c; } *head = a; return a; }
==================================二叉树==================================
1. 结点数量相关问题
(1)不同度结点的关系
(2)计算结点总数
https://www.cnblogs.com/taoXiang/p/12324454.html
(3)树深度
https://www.cnblogs.com/taoXiang/p/12324454.html
2. 二叉树形状推导
(1)已知前序遍历和中序遍历
前序:ABDHIEJKCFLMGNO
中序:HDIBJEKALFMCNGO
还原:
分块,区分哪一块是左边的、哪一块是右边的:
【A B DHI EJK C FLM GNO】
【HDI B JEK A LFM C NGO】
①根据前序,A是最上面的结点,根据中序,则【HDI B JEK】为A左侧结点,【LFM C NGO】为A右侧结点
②分析A左侧这部分,右侧类似
分析【B DHI EJK】【HDI B JEK】,B是根,【DHI】为B左侧结点,【JEK】为B右侧结点
分析【C FLM GNO】【LFM C NGO】,C是根,【FLM】为C左侧,【GNO】为C的右侧结点
③
分析【DHI】【HDI】,D是根,H为D左侧点,I为D右侧点
分析【EJK】【JEK】,E为根,J为E左侧点,K为E右侧点
分析【FLM】【LFM】,F为根,L为F左侧点,M为F右侧点
分析【GNO】【NGO】,G为根,N为G左侧点,O为G右侧点
(2)已知后序遍历和中序遍历
后序:HIDJKEBLMFNOGCA
中序:HDIBJEKALFMCNGO
(3)已知后序遍历和前序遍历
无法推断