2 树的表示法
2.1 多叉树的表示法
2.1.1 双亲表示法
- 表格表示
- 参考代码
struct Node{
char data;
int parent;
};
Node nodes[n];
- 优缺点
比较容易找到双亲,但是不容易找到孩子。
2.1.2 孩子表示法
- 表格表示
参考代码
struct Node{
char data;
vector<int> children;
};
Node nodes[n];
- 优缺点
比较容易找到孩子,但是不容易找到双亲。
2.1.3 双亲孩子表示法
- 表格表示
- 参考代码
struct Node{
char data;
int parent;
vector<int> children;
};
Node nodes[n];
- 优缺点
双亲孩子都比较容易找到。
2.1.4 孩子兄弟表示法
- 表格表示
- 参考代码
struct Node{
char data;
int firstchild;
int rightsib;
};
Node nodes[n];
- 优缺点
比较容易找到孩子和兄弟,但是不容易找到双亲。
孩子兄弟表示法主要用来把多叉树转化成二叉树。
2.2 二叉树表示法
2.2.1 顺序存储方式
将二叉树存储在一个数组中,通过存储元素的下标反映元素之间的父子关系。用一组连续地址的存储空间依次自上而下、自左到右存储二叉树上的节点。
一棵深度为
k
k
k的二叉树通常需要
2
k
−
1
2^k-1
2k−1个节点空间存储。
节点之间的关系根据二叉树的性质确定。
节点 | 下标 |
---|---|
根节点 | 1 1 1 |
叶子节点 i i i | 2 i > 2 k − 1 2i>2^k-1 2i>2k−1 |
节点 i i i的父节点 | i / 2 i/2 i/2 |
节点 i i i的左孩子节点 | 2 i 2i 2i |
节点 i i i的右孩子节点 | 2 i + 1 2i+1 2i+1 |
通常使用
0
0
0表示空节点。
结点个数已知的完全二叉树或接近完全二叉树的二叉树,通常使用这种方式。最坏情况为深度为
k
k
k且只有
k
k
k个节点的单支数。
注:顺序存储只适用于完全二叉树(包括满二叉树)
2.2.2 链式存储方式
因为顺序存储存在的局限性,二叉树比较常见的是链式存储方式。由于二叉树结构简单,通常使用孩子表示法,或者孩子双亲表示法。
- 孩子表示法
struct Node{
char data;
struct Node* right_child;
struct Node*left_child;
};
Node* head;
- 孩子双亲表示法
struct Node{
char data;
struct Node* right_child;
struct Node* left_child;
struct Node* parent;
};
Node* head;