1.0 重点知识
- 树的遍历
- 二叉树的性质
- 二叉树和树的存储表示
- 二叉树的遍历及算法实现
- 树与二叉树之间的转换
- 哈夫曼树及其应用
2.0 树的定义
树是n (n>0)个结点的有限集合 n = 0 就是空树了
树有一下几个条件.
- 有且仅有有个根结点
- 除了跟结点外 其余结点呗分成了 n 个互不相交的子树
3.0 一些基本术语
- 结点 树中的数据元素
- 节点的度 这个节点的子树的个数
- 树的度 树中结点度的最大值
- 叶子结点 度为0的结点 也叫终端结点
- 分支结点 也叫非终端结点 不是叶子结点就是分支结点
- 孩子 、双亲、兄弟节点 这个不知道咋说 很好理解吧 还有祖先 子孙
- 路径
- 路径长度
- 结点的层数
- 树的深度
- 层序编号
- 有序数
- 无序树
补充 书中图 5-2 a图 A B E就是一条路径 路径长度就是 2 也就是边数呗
4.0 树的常用操作
例子均是以 书中图 5-2 a图 为例子
4.1 前序遍历
顺序 中 左 右
A B D E F C G
这里注意每次进入一个子树均按中左右顺序进行遍历
4.2 后序遍历
左右中
D E F B G C A
4.3 层序遍历 也叫广度遍历
一层一层来的
ABCDEFG
5.0 树的表示法
- 双亲表示法
这个简单 就是数据域含有两个元素 一个是我们存着的数据,另一个是这个节点双亲的坐标
struct Node{
int data;
int position;
}
上个图
存储结构是数组
优点是找双亲节点方便
- 孩子表示法
- 多重链表表示法
这个就更简单了
struct Node1{
int data;
int degree;
Node* child2;
Node* child3;
Node* child4;
Node* child5;
}
struct Node2{
int data;
Node* child2;
Node* child3;
Node* child4;
Node* child5;
Node* child6;
}
Node1 中指针域指向该节点的所有孩子节点 指针数等于该节点的度 很少采用 因为节点的度不同时,很难操作
Node2 中指针域指向该节点的所有孩子节点,指针数等于树的度,浪费了存储空间便于操作
- 孩子链表表示法
这个是数组和链表的结合 假设有 ABCD四个节点
那么这四个节点存储方式为
struct Node{
int data;
Node* child;
}
构成一个数组,然后指针域指向他的孩子节点
上图
优点是找兄弟节点方便
- 双亲孩子表示法
这个就是双亲表示法和孩子链表表示法的综合 直接上图 不解释
查找双亲兄弟都方便
- 孩子兄弟表示法
节点结构
struct Node{
int data;
Node* child;//指向第一个孩子节点
Node* rightBrother;//指向右兄弟节点
}
这个的意思就是假如节点 A 的孩子节点是BCD 那么A的孩子节点指针指向的是B(也就是第一个) 右兄弟指针指向NULL(跟结点没有兄弟)
然后 B的孩子节点指向NULL (他没有孩子节点) B的右兄弟指向 C 同理 C的右兄弟执行D
-
上图
这种方法的有点是便于实现树的各种操作