树
- 一种 元素之间存在一对多关系的数据结构,常用于表示数据结构,辅助排序,查找,族谱关系,组织关系,。一般根在上,支在下(倒悬树)
-
树的相关术语
- 根结点:树的最顶层元素,有且仅有一个
- 子结点:结点的下一层元素也叫孩子结点
- 双亲结点:上一层元素也叫父结点
- 兄弟结点:有同一个父节点的结点,处在同一层
- 叶子结点:树型的最底层,没有子节点的结点,一般处于树的最底层
- 树的高度 :树的层数
- 结点的度 :一个结点的子结点的数量
- 密度 :树的结点个数,包括根结点
- 结点 :一个元素就是一个结点
-
普通树:子节点的数量不确定 没有限制
- 顺序存储
下标 数据 父节点下标 第一个子节点下表 最后一个 0 ROOT -1(根) 1 1 1 A 0 -1 -1 - 对元素结点的存储顺序没有要求 下标 结点(存的数据) 双亲(上一层下标 顶层-1) 0 A -1
- 从上到下,从左到右
- 下标
- 结点(存的数据)
- 双亲(上一层下标 顶层-1)
- 第一个孩子的下标(没有为-1) 0 A -1 1
- 从上到下,从左到右
- 下标
- 结点(存的数据)
- 双亲(上一层下标 顶层-1)
- 第一个孩子的下标(没有为-1)
- 最后一个孩子的下标(没有为-1) 0 A -1 1 2
- 链式存储
a——b——c——d//a是根,bcd是a的子节点 |//e是b的子节点 e typedef struct Node { TYPE data; Node* brother; Node* child; }Node;
二叉树:子节点不多于两个
-
相关术语:
-
遍历:
- 前序:根,左,右
- 中序:左,根,右
- 后序:左,右,根
- 层序:从上到下,从左到右
-
根据遍历顺序重构二叉树:
- 前,中:已知前序和中序构建二叉树
- 后,中:已知后序和中序构建二叉树
- 层序:空位置用#表示,相当于满二叉树
-
普通二叉树:对二叉树的结点没有数量及位置上的要求
-
满二叉树:一定有两个孩子 pow(2,层数-1)2的n-1次
-
完全二叉树:对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树
- 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
-
有序二叉树:左子树的所有结点都比根结点小,右子树都比根结点大
-
平衡/有序/二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树(有序二叉树前提)
-
-
顺序存储
- n = 2^(k-1) n表示k层节点数
- i i2+1 i2+2
- 第i个节点
- 第i个节点的左节点
- 第i个节点的右节点
-
二叉树的相关计算
- n0表示0个子节点的节点个数
- n1表示1个子节点的节点个数
- n2表示2个子节点的节点个数
- k为所有节点个数
n0 + n1 + n2 = k 2*n2 + n1 + 1 = k n2 + 1 = n0