线性表
1,顺序表
删除操作:(3,4,5,6)
方法一:再编号法
方法二:前移k次法
方法三:尾插法(开始时只有第一个元素在顺序表中,慢慢尾插;重新构造新的线性表)例题:王道P18,题6
合并:(题7)
合并两个有序顺序表:1,按顺序不断取下两顺序表表头较小的节点存入新的顺序表。2,将剩下的部分加到新的顺序表的后面
位置变换:(题8)
可能的方法:逆置(reverse)如王道 题8,reverse方法使移动只需 o(m+n)次
记住折半查找失败的最终状态:王道P24
2,链表
链表删除操作:
两个指针:pre(当前指针的前驱指针),p(当前指针)
删除条件匹配时:pre不变,p=p->next;
删除条件不匹配时:pre=pre->next;p=p->next;
删除最小值:pre,p,minpre,minp
将单链表顺序逆置:1,头插法;2,指针逐个反转法(pre,p,r)
尾插法->顺序(保持原节点中的顺序)
单链表的排序:采用直接插入排序算法的思想,在原表之外建立一个只有一个节点的有序单链表。依次扫描,逐个插入。
在进行类似头插法的操作时,需要引入指针r,目的是保持*p后继结点指针,以保证不断链。
两个单链表有公共节点:即两个链表从某一结点开始,它们的next都指向同一个节点。由于每个单链表的next域只有一个,因此从第一个公共节点开始,之后他们所有的节点都是重合的。之可能出现Y字形的拓扑结构,不可能出现X形的拓扑结构。
当两个单链表有公共部分时,找公共节点的算法:1,计算两个单链表的长度。2,将长的单链表先遍历两个单链表长度之差个节点,然后同步移动两个指向两个单链表的指针,当第一次出现两个指针的值相等时,则找到了第一个公共节点,且此后所有节点都是公共节点。
头插法:首先将头节点的指针域置为NULL;head->next=NULL;
尾插法:先插入节点,在最后将尾节点的指针域置为NULL,rear-next=NULL;
建立头节点:LinkList a= (Linklist)malloc(sizeof(LNode);
创建新节点:Lnode *s=(LNode *)malloc(sizeof(LNode);
设置工作指针:p=L->next;
使用栈来判断链表的数据是否中心对称:让链表的前一半元素依次进栈。在处理链表后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,若所有元素都相同,则中心对称。(要分奇偶讨论)
树:
对按顺序存储结构的二叉树,找两个节点的最近的公共祖先:序号小的等序号大的节点。
层序遍历求二叉树的高度
思路:
二叉树的高度等于层数,要求层数,只需找到每层最右节点的个数。
当队头指针=最右节点时,更新最右节点。因为此时队列中正好刚刚将下一层的所有结点都遍历了,此时的队尾结点就是要更新的最右节点。
循环结束条件同层序遍历结束条件,队空时跳出循环
此法还可以用来求某层的结点个数、每层的节点个数、树的最大宽度
求树的高度的递归算法:p135
实现用先序和后序遍历序列构造二叉树的二叉链表(用递归)
判断一棵二叉树是否未完全二叉树:
思路:用层序遍历,将包括空结点的所有节点加入队列,当访问到第一个空结点时,判断其后是否还有非空结点,如果有则不是完全二叉树;否则,是完全二叉树。
实现把用链式结构存储的二叉树的所有节点的左右子树互换。
思路:要互换所有结点的左右子树,那么先从最末端开始互换,即从叶子节点开始互换,当下层的呼唤完成上层只需互换本层的节点即可。这种从叶子节点开始遍历的思想同 后序遍历的思想相同。所以用后续遍历来完成。P127
删除以元素x为根的子树:(后序遍历(删除x的子树)+层序遍历(搜x结点))
思路:要删除以x为根的子树,同上题左右子树交换的思路,要使用后序遍历(要从叶子节点开始删除),要遍历整个树搜索data域为x的结点,这里使用层序遍历
题12(非递归后序遍历的应用)
找公共祖先结点:
两种情况:1,顺序存储的二叉树(p113,题5);2,链式存储的二叉树(p127,题13)
对情况1:序号小的等序号大的
对情况2:设两个节点指针为p,q;且设p在q的左边。
采用非递归后序遍历,当遍历到p指向的结点时,用一个辅助栈保存当前栈的信息。然后继续遍历,当遍历到q时,将此时的栈中的元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配的即为最近的公共祖先。
求以孩子兄弟链表为存储结构的树的深度
思路:递归;若树空,高度为零;否则,高度为第一子树高度+1和兄弟子树高度大者;
转载:https://blog.csdn.net/qq_37637619/article/details/102489220