图片来源于网络!!!
-
基本概念
树是n(n >= 0)个结点的有限集合T(Tree)。 当n = 0 是,称为空树, 当n > 0 时, 该集合满足如下条件:- 其中必定有一个称为根(root)的特定节点,它没有前驱, 但有零个或多个直接后续。
- 其中n - 1个结点可以分成n1(m >= 0)个互不相交的有限集T1,T2, T3… Tm, 其中Ti又是一棵树,称为根结点的子树。每棵子树的根结点有且仅有一个直接前驱, 但有零个或多个直接后继
结点:包含一个一个数据元素及若干指向其他结点的分支信息。
结点的度:一个结点的子树个数称为此结点的度。
叶结点:度为0的结点,即无后继结点,也称为终端结点。
分支结点:度不为0的结点,也称为非终端结点。
孩子节点:一个结点的直接后继称为该结点的孩子结点。
双亲节点:一个结点的直接前驱称为该结点的双亲结点。
兄弟结点:同一双亲结点的孩子结点之间互称为兄弟结点。
祖先结点:一个结点的祖先结点是指从根结点到该结点的路径上的所有结点。
子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。
树的度:树中所有结点的最大值。
结点的层次:从根结点开始定义,根结点的层次为1,根结点的后继层次为2,以此类推。
树的高度(深度):树中所有结点的层次的最大值。
有序树:在树T中,如果各子树Ti之间是有先后顺序的,则称为有叙述。
森林:m(m >= 0)棵互不相交的树的集合。将一棵非空树的根节点删去,树就变成了森林;反之,给森林增加一个统一的根节点,就形 成了一棵树。
- 二叉树
定义:我们把满足一下两个条件的树形结构叫做二叉树(binary tree)- 每个节点的度都不大于2
- 每个结点的孩子节点次序不能任意颠倒
一个二叉树的每个结点只能含有0,1,2个孩子,且每个孩子有左右之分,位于左边的是左孩子,右边是右孩子。
满二叉树:深度为k且有2^k - 1个节点的二叉树。
完全二叉树:深度为k,结点为n,且结点1~n的位置序号与满二叉树一一对应
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
层间从上到下,层内从左到右编号
性质
1.在二叉树的第i层上之多有2^i-1个结点(i>=1)
证:因为是至多,所以假设这是一个满二叉树,也就是每一个结点的度都为2,即每一结点都有两个孩子节点,所以这个数的每一层结点的个数都是上一层的两倍,所以A(i) = 2^i-1。
2.深度为k的二叉树至多有2^k - 1个结点(k >= 1)。
证:深度为k的二叉树,其最大值是将每一层的最大值相加。
3.对于任意一棵二叉树T,N(0) = N(2) + 1(N(i)表示度为i的结点的个数)
证:n = N(0) + N(1) + N(2)
n - 1 = b(b为边数)
且二叉树中的分支都是度为1或2的结点发出,所以
b = N(1) + 2N(2)
整理得
n = b + 1 = N(1) + 2N(2) + 1
将n = N(0) + N(1) + N(2)代入,整理后得N(0) = N(2) + 1
4.具有n个结点的完全二叉树的深度为int(log2n) + 1
5.将完全二叉树自顶而下,同一层自左向右编号,则有:
如果i=1,i为根,无双亲;如果i>1,双亲为结点int(i/2)
如果2i<=n,结点i的左孩子为结点2i;否则无左孩子
如果2i+1<=n,结点i的右孩子为结点2i+1,否则无右孩子
顺序存储结构
二叉树的结构是非线性的,每一结点最多可有两个后继。
二叉树的存储结构有两种:顺序存储结构和链式存储结构
链式存储结构
声明二叉树的二叉链表结构
typedef struct Node
{
DataType date;
struct Node *LChild;
struct Node *RChild;
struct Node *Parent;
}BiTNode, *BiTree;
二叉树的遍历
用L, D, R分别表示遍历左子树,访问根节点,遍历右子树。
升序遍历 DLR
中序遍历 LDR
后序遍历 LRD