1. 链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
每个结点包括两个部分:存储数据元素的数据域、存储其他结点地址的指针域。
单链表添加及删除:
// 单链表的添加
// 在cur之后插入new结点
new->next=cur->next; // 先将new后继指向cur的后继
cur->next=new; // 再将cur指向new
// 单链表的删除
// 删除cur结点
prev->next=cur->next; // 先将prev的后继指向cur的后继
cur->next=NULL; // cur的后继指向NULL
双链表添加及删除:
// 双链表的添加
// 在cur之后插入new结点
new->next=cur->next; // 先将new后继指向cur的后继
cur->next->prev=new; // 再将cur的后继的前驱指向new
cur->next=new; // 再将cur的后继指向new
new->prev=cur; // 再将new的前驱指向cur
// 双链表的删除
// 删除cur结点
cur->prev->next=cur->next; // 先将cur的前驱的后继指向cur的后继
cur->next->prev=cur->pre; // 再将cur的后继的前驱指向cur的前驱
cur->prev=NULL; // 将cur的前驱指向NULL
cur->next=NULL; // 将cur的后继指向NULL
2. 树与二叉树
- 结点:包含数据元素和若干指向其结点的分支信息的数据结构;
- 结点的度:结点拥有子的个数叫该结点的度;
- 叶子结点(终端结点):度为0的结点;
- 分支结点:度不为0的结点;
- 孩子节点、父结点、兄弟结点:树中一个结点的子树的根结点称为这个结点的孩子结点,这个结点称为孩子结点的父亲节点,具有同一个父亲结点的孩子结点互称为兄弟结点;
- 结点层次:根结点层次为1,其余结点层次等于父亲结点层次加1;
- 祖先、子孙:树中有路径从m到n,则m为n的相先,n为m的子孙;
- 树的深度:树中所有结点的层次的最大数;
- 树的度:树中所有结点的度的最大值;
- 森林:m (m>0) 棵不相交的树的集合称为森林。
- A、B、C、F是分支结点,D、H、F、G是叶子节点;
- B的层次为2,B的度为3,树的度为3,树的深度为4;
- A为根节点,A是B的父亲节点,B是A的孩子结点,B和C是兄弟结点;
- B是H的祖先,H是B的子孙。
二叉树性质:
性质1:二叉树的第i层上至多有个结点
性质2:深度为k的二叉树至多有个结点
性质3:对于一棵非空二叉树,如果叶子结点数为,度数为2的结点数为
,则有
性质4:具有n个结点的完全二叉树深度为,[x]表示不大于x的最大整数;
性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号,对任一结点有:
①如果i=1,则结点是二叉树的根,无双亲;如果i>1,则其双亲是[i/2];
②如果2i>n,则结点i无左孩子;如果2i≤n,则其左孩子是2i;
③如果2i+1>n,则结点i无右孩子;如果2i+1≤n,则其右孩子是2i+1。
二叉树遍历:
前序遍历:根结点→左子树→右子树
中序遍历:左子树→根节点→右子树
后序遍历:左子树→右子树→根节点
层次遍历:从上到下逐层,同层中从左到右逐个结点
已知前序、中序遍历,可以唯一确定一棵二叉树
已知后序、中序遍历,可以唯一确定一棵二叉树
已知前序、后序遍历,可以唯一确定一棵二叉树