链表,二叉树相关算法的简单整理
最近在刷牛客网的剑指offer的题,感觉自己的编程能力还是很差,有时候有思路但是总是需要调试蛮久的时间,但是练习的太少。
链表
A->B->C->D
简单的说单链表就是一个当前的节点只指向链表的下一个节点,链表的前一个节点不知道,它的每一个节点中只保留这当前节点的值,和下一个节点.
(1)找出链表倒数第K位的数据(稳定性)
排除,链表为空,链表的长度小于K的情况。
双指针,一个指针先走K-1步,另一个指针开始移动
(2)将链表中的数据根据比K的数放在左边,比K小的数据放在右边,相对位置不发生变化。
新建两个链表,一个保存比K小的,一个保留比K大的(以空间换时间)
(3)删除链表中的一个节点
由于不知道上一个节点,但是知道下一个节点,复制下一个节点的所有信息就可以了
(4)将两个排完序的链表进行合并,合并后的链表还是有序的
新建一个链表,哪个链表的值大,谁的指针向后移动一位,原理比较简单,但是注意指针的移动
(5)删除链表中重复的元素节点
排序,然后再比较
(6)翻转链表(没有额外的空间)
随着指针的移动改变节点的指向
二叉树
(1)恢复二叉树,已知前序中序,已知中序后序
迭代,根据中序获取根节点,根据前序和后序获取左右子树的长度
(2)前序、中序、后序
中序:迭代比较方便
前序和后序:用栈比较方便
(3)二叉树镜像
左右节点互换
(4)已知两个二叉树,判断是否是子树
序列化两个二叉树,用KMP算法
(5)打印,序列化二叉树
每层的最后一个节点位置要控制好