1.树(tree)的概念
注释在线结构:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
树:是n个节点的有限集合。当n=0时,称为空树。在任意一个非空树中,有且仅有一个特定的称为根(root)的节点。当n>1时,其余节点可分为m(m>0)个互不相交的有限集合 T1,T2 ,Tm,其中每一个集合又是一棵树,并且称为根的子树。
节点的度:节点拥有的子树个数称为节点的度。如下图B节点的度为2,J节点的度为1,度为0的节点称为叶子节点或终端节点(拥有一个节点的树),如 A,C,E,K
树的度:节点的度中最大值,为数的度,如下图树度为2
树的深度或高度:节点的层次从根开始定义起,根为第一层,根的孩子为第二层
如下如:
线性结构:
- 第一个数据元素:无前驱。
- 最后一个元素:无后继。
- 中间元素:一个前驱一个后继。
树结构:
- 根节点:无双亲,唯一。
- 叶子节点:无孩子,可以多个。
- 中间节点:一个双亲多个孩子。
2.树的存储结构
2.1 双亲表示法
结构代码定义:
@Data
public class TreeParentDemo {
//根节点
private Node root;
public TreeDemo(String data) {
this.root = new Node(data,null);
}
@Data
class Node{
public Node(String data, Node parent) {
this.data = data;
this.parent = parent;
}
/**
* 数据域 存储A,B,C等
*/
private String data;
/**
* 指向父亲节点的地址
*/
private Node parent;
}
}
注释:根节点的父级地址设置为null,每个节点存储数据域和父级节点地址。
如下图:
数据库存储:
id | data | parentId |
---|---|---|
0 | A | -1 |
1 | B | 0 |
2 | C | 0 |
3 | D | 1 |
4 | E | 2 |
5 | F | 2 |
6 | G | 3 |
7 | H | 3 |
8 | I | 3 |
9 | J | 4 |
优点:1.查找已知节点的父节点很容易,直接通过父级节点地址找到它的双亲。所用时间复杂度为O[1]。
例如:已知F(5)节点 ,查找其父节点,可直接通过F节点中父级地址(id:2),直接查找。
缺点:1.查找已知节点的孩子节点,需要遍历整个数据结构才行.
例如:已知F(5)节点 ,查找其孩子节点,需要遍历正个数据结构,对比查找。如数据库执行 select * from 表 where parentId = 5 需要扫描整个数据行一一对比(该表parentId未加索引的情况下).
2.2 孩子表示发
结构代码定义:
<