树
树是一种元素之间存在一对多关系的数据结构,常用于表现族谱关系、组织关系等,也可以借助特殊的树型结构实现查找、排序等算法。常用于表示组织结构、排序、辅助排序、查找等,一般以倒悬树的形式显示,根在上支在下。
树相关的术语:
根:树的最顶层的元素,有且仅有一个
双亲(父结点):指的是元素的上一层元素
孩子:指的是下一层元素
兄弟:具有同一个父结点的元素,处在同一层
度:一个结点的子结点的数量
高度:指的是树的层数
密度:树的元素个数
结点:一个元素就是一个结点
普通树
子结点的数量没有限制。
普通树的顺序存储。
一、对结点的存储顺序没有要求。
分别存放下标、结点、父亲结点的下标
二、从上到下、从左到右的存储(兄弟结点连续存储)。
比一多存储一个第一个子结点下标
三、从上到下、从左到右的存储。
比二多存储一个最后一个子结点下标
普通树的链式存储。
typedef struct Node
{
TYPE data;
struct Node* brother;
struct Node* child;
}
二叉树
子结点的数量最多为2。
相关术语:
遍历:前序遍历:根,左,右
中序遍历:左,根,右
后序遍历:左,右,根
层序遍历:从上到下,先左后右
根据遍历顺序构建二叉树:
前、中:已知前序和中序构建二叉树。
{1,2,4,7,3,5,6,8}
{4,7,2,1,5,3,8,6}
后、中:已知后序和中序构建二叉树。
层序:空位置用#表示
普通二叉树:对二叉树的结点没有位置及数量上的要求
满二叉树:树的每一层的结点数量都是2^(层数-1)。
完全二叉树:除了最后一层,其它每一层的结点数量都是2^(层数-1),最后一层的结点按照从左往右的顺序存储。
有序二叉树:左子树的所有结点都比双亲小,右子树的所有结点都比双亲大
平衡二叉树:首先是有序的二叉树,左右高度相差不超过1的有序二叉树,并且子树的子树也满足这个要求
红黑树:实现平衡的一种手段
二叉树的顺序存储:
1、2^(k-1) k层的结点数量
2、2^(k-1)-1 第K层第一个结点的下标(也是第K层之前所有层的结点数量的和)
3、2^(k)-2 第K层最后一个元素的下标
4、2^(h-1)-1+n-1 =》2^(h-1)+n-2 访问第h行第n个元素
完全二叉树的一些特点:
1、满二叉树是完全二叉树,完全二叉树不一定是满二叉树
2、在满二叉树的下一层上,从最右边开始连续删去若干个结点后得到的二叉树任然是一棵完全二叉树
3、在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必定是叶子结点。
二叉树的一些性质:
1、在二叉树的第i层上最多有2^(i-1)个结点(i>=1)
2、深度为k的二叉树最多有2^k-1个节点
3、对任何一棵非空二叉树,如果其度为0的结点数为n0,度为2的结点数为n2,则n0=n2+1
证明:设二叉树的总结点数为n,度为0的结点数为n0,度为1的结点数为n1,度为2的结点数为n2,则:
(1)n=n0+n1+n2;
(2)n=n1+2*n2+1;
由上述两个式子可得n0=n2+1;
4、具有n个结点的完全二叉树的深度为[log2(n+1)](结果向上取整)
5、如果对一棵具有n个结点的完全二叉树(其深度为[log2(n+1)](结果向上取整))
的结点按层序编号(从第1层到第[log2(n+1)](结果向上取整)层,每层从左到右),
则对于任一结点(1<=i<=n),有:
(1)如果i=1,则结点i是二叉树的根且无双亲;如果i>1,则其双亲结点是结点i/2
(2)如果2*i>n,则结点i无左孩子(结点i为叶子结点),否则其左孩子是结点i*2
(3)如果2*i+1>n,则结点i无右孩子;否则其左孩子是结点i*2+1;
(4)若结点编号i为奇数,且i!=1,它处于右兄弟位置,则它的左兄弟为结点i-1
(5)若结点编号i为偶数,且i!=n,它处于左兄弟位置,则它的右兄弟为结点i+1
(6)结点i所在层次为k=[log2i](结果向下取整)+1(i>=1)
6、完全二叉树结点数量为奇数则没有度为1的结点
7、完全二叉树结点数量为偶数,则叶子结点数为结点数量/2,为奇数则(结点数量+1)/2
8、无右孩子的节点个数=叶子节点数+度为1的节点数=节点总数-度为2的节点数。
9、N个结点构成的无环图有N-1条边,每条边对应了一个(出)度,即度数之和为N-1