~~~~~~~
1) 基本特征:内存中不连续的节点序列,节点之间通过next指针彼此相连;
每个节点的next指针都指向下一个节点,最后一个节点的next指针为NULL。
2) 基本操作:插入、删除、遍历。3) 实现要点
追加:将新分配节点的地址赋给原链表最后一个节点的next指针。
插入:将前节点中存储的后节点地址赋给新节点的next指针,将新节点的地址赋给前节点的next指针。
删除:将前节点的next指针赋值为待删除节点的next指针。对于单向链表而言,寻找前节点会有一定开销。
遍历:沿着next指针依次访问链表中的各个节点。
伪随机访问:遍历+计数。
(1)单向链表
只能向后走
(2)双向链表
既可以向前走,又可以向后走。
******************************************************************************************************************
如果单向线性链表里,每个节点可以向后找到多个其他节点,这也是一个数据结构,这个数据结构叫树
可以把树里的所有节点分成几层,不同层之间有方向,这些方向都是一致的
树最上面一层应该只有一个节点,这个节点叫做根节点
根节点可以代表整棵树
树里存在直接联系的两个节点之间有父子关系,靠近根节点的是父节点,远离根节点的是子节点
任何节点最多只能有一个父节点(根节点没有父节点)
如果一个树里任何节点最多只能有两个子节点,这种树叫做二叉树
二叉树是最简单的树
二叉树里用左右区分任何一个节点的两个子节点
二叉树里任何一个节点和他下面的所有节点都可以看作的是一个新的二叉树
节点A的左子节点代表的树叫做节点A的左子树,右子节点代表的树叫做右子树。
树中的大多数操作都是通过遍历来实现的,树的遍历大多都是通过递归来实现的。(问题能分解,分解后的小问题可以用该方法解决,一般采用递归)
在遍历树的时候左子树一定在右子树前被处理,一共有三种方式遍历树:
(1)最开始处理根节点的遍历方式,叫做前序遍历 处理节点自己的数据->处理左节点->处理右节点。
(2)中间处理根节点的遍历方式,叫做中序遍历 处理左节点->处理节点自己的数据->处理右节点。
(3)最后处理根节点的遍历方式,叫做后序遍历 处理左节点->处理右节点->处理节点自己的数据。
为何一般只研究二叉树呢?
因为任何树都可以转化为二叉树