上图的树,使用最简单的父节点表示法可以表示为:
index(数组索引) | data(数据域) | parent(父节点索引) |
0 | r | -1 |
1 | a | 0 |
2 | b | 0 |
3 | c | 0 |
4 | d | 1 |
5 | e | 1 |
6 | f | 2 |
7 | g | 3 |
8 | h | 3 |
9 | i | 4 |
10 | j | 4 |
11 | k | 4 |
树节点的设计可以是:
/**
-
树节点的设计
-
@param E类型
*/
private static class TreeNode {
//数据域
E e;
//父节点的索引
int parent;
public TreeNode(E e, int parent) {
this.e = e;
this.parent = parent;
}
}
这样的存储结构,我们可以根据结点的parent索引很容易找到它的双亲结点,所用的时间复杂度为O(1),直到parent为-1时,表示找到了树结点的根。但是如果要知道孩子节点是什么,那就需要遍历整个数组才行。
2.2 父子节点链表示法
为了能够直观的找到一个节点的孩子节点。在原节点中添加一个子节点链表,原节点保存子节点链表的头索引,同时节点保存着父节点的索引。这需要一种新的孩子节点。
index(数组索引) | data(数据域) | parent(父节点索引) | child(子节点链表头索引) |
0 | r | -1 | a->b->c->null |