树
元素之间存储一对多关系的数据结构,常用于表现族谱关系、组织关系等,也可以借助特殊的树型结构实现查找、排序等算法,一般使用倒悬树的方式表示。
树的相关术语
根结点:树的最上层元素,有且只能有一个。
子结点:该结点的对应下一层元素。
父结点:该结点的对应上一层元素。
叶子结点:没有子结点的元素,一般处于树的最底层。
兄弟结点:具有同一个父结点的元素,处在同一层。
高度:指的是树的层数。
密度:指的是树的结点数(包括根结点)。
度:指的是结点的子结点数量。
普通树
子结点的数量没有限制。
顺序存储
1、每个结点一行
2、兄弟结点连续存储
3、兄弟结点连续存储
链式存储
typedef struct Node
{
TYPE data;
struct Node* brother;
struct Node* child;
}Node;
二叉树
子结点的数量最多为2。
相关术语
深度遍历/深度优先:
前序遍历:根,左,右
中序遍历:左,根,右
后序遍历:左,右,根
广度遍历/广度优先:
层序遍历:从上到下,先左后右
根据遍历顺序构建二叉树
前中:己知前序、中序构建二叉树。
{1,2,4,7,3,5,6,8}
{4,7,2,1,5,3,8,6}
后中:己知后序、中序构建二叉树。
{4,7,2,1,5,3,8,6}
{7,4,2,5,8,6,3,1}
层序:空位置用#表示(相当于一颗满二叉树),3,1,5,#,2,4,#。
普通二叉树
对二叉树的结没有位置及数量上的要求。
满二叉树
树的每一层的结点数量都是:2^(层数-1),即pow(2,层数-1)
只有放满或不放两种状态
注:
根节点的第一个左子节点的下标,等于其下标 * 2+1
根节点的第一个右子节点的下标,等于其下标 * 2+2
完全二叉树
除了最后一层,其它每一层的结点数量都是:2^(层数-1)即pow(2,层数-1)
最后层的结点按照从左往右的顺序存储。
有序二叉树
所有的左子结点都小于根结点,所有右子结点都大于等于根结点。
注意:每次添加结点都要一层一层比
注:中序遍历输出从小到大,右中左遍历输出从大到小
平衡二叉树
首先是有序的二叉树,树的左右子树的高度相差不超过1,并且子树的子树都满足这个要求。
(红黑树)(二分查找)
二叉树的顺序存储
注意公式:2^(h-1)
h=1 1
h=2 2 3
h=3 4 5 6 7
h=4 8 9 10
2^(h-1)等于第h行结点个数
2^(h-1)-1 等于当前第一个结点的下标。
第n个结点的公式为:2^(h-1)-1 + n - 1 => 2^(h-1) + n - 2