数据结构——树
(一)基本概念
- 结点为n的树必然有n-1条边
- 结点通常存储在数组中、(?)实际上偏向于用链表来实现树
- equivalence class 等价类
(二)practice
- 树的前后续遍历
- 归并查找(路径压缩 )(加权合并规则)
(三)
- 并查算法UNION/FIND:
(1)判断两个节点是否在同一集合中
(2)归并两个集合
Find根节点的函数:
int FIND(int curr){
while(array[curr]!=root)
{ curr=array[curr];}
return curr;
}
- 使用函数differ 检查一个等价对中的两个元素是否在同一棵树中,是就不需变动
- 若不在,用UNION函数归并两个等价类
为降低树的高度:
- weighted union rule 加权合并规则:把结点较少的一棵树和节点较多的一棵树归并时,把结点较少的根节点指向结点较多的。
- path compression 路径压缩:查找一个结点X的根节点时,把根节点设为R,然后顺着X到R的路径把每个节点的父指针域都设置为指向R
//FIND with path compression
int find(int curr){
if(array[curr]==root){return curr;}
array[curr]=find(array[curr]);
return array[curr];
}
(四)树的表示:
(1)parent point表示法(父指针表示):父节点下标、标号(元素值)、结点下标(0-n)
(2)子结点表 表示法:包括:父节点,父节点后从左子节点到右子节点的链表结构
(3)左子结点/右兄弟结点表示法
每个结点存储结点的值,以及指向父节点、最左子节点和右兄弟结点指针