(定义部分摘自清华大学出版社《数据结构(C语言版)》)
1. 树的定义和基本术语
树(Tree)是具有n(n>=0)个节点的有限集合。在任意一颗非空树中:(1)有且仅有一个特定的节点称为“根”(root);(2) 当n>1时,其余节点又可以分为m个互不相交的有限集合T1,T2,...,Tm。这些集合,称为子树。m为与root直接相连的节点数目。
树的节点包含一个数据元素及若干指向其子树的分支。
结点拥有的子树数目称为结点的度(degree)。
出度为0的节点称为叶子(Leaf)或者终端结点。
度不为零的结点称之为分支节点。
一棵树的度是树内各结点的度的最大值。
一棵树的深度(depth):自root出发,到达某个叶子的路径长度的最大值。
有序树: 树中结点的各个子树从左至右是有序的,否则为无序树。
森林(Forest): m个互不相交的树的集合。对树中的每个节点而言,其子树的集合即为森林。
---------------------------------------------------------------------------------------------------
二叉树(Binary Tree)
一种特殊的树结构,其特点是每个结点至多有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,即为有序树。
满二叉树: 一棵深度为k且有 2^k-1个节点的二叉树。
完全二叉树: 对满二叉树的结点进行连续编号,约定编号从根节点开始,自上而下,自左至右。深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。
2. 二叉树的性质
性质1 在二叉树的第i层上至多有2^(i-1)个节点(i>=1)。
性质2 深度为k的二叉树至多有2^k -1个结点(k>=1)。
性质3 对于任意一棵二叉树T,如果其终端结点数为n0,度为2的结点树为n2,则有 n0 = n2 +1;
性质4 具有n个结点 的完全二叉树的深度为floor(logn)+1(此处floor意为取下整)。
性质5 如果对一棵有n个节点的完全二叉树的结点按层序编号,则对任一节点i(1<=i<=n),有
(1) 如果i=1,则节点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)是结点 floor(i/2)。
(2) 如果2i >n, 则结点i无左孩子;否则其左孩子为节点2i。
(3) 如果2i +1 >n, 则结点i无右孩子;否则其右孩子为结点2i+1.
根据二叉树的特点,既可以用数组的形式来存储,也可以用链式存储的结构。(ps: 如果是完全二叉树,数组形式存储比较好。然而最坏情况下,当一个深度为k且只有k个单节点的树用数组存储的时候,数组的大小为 2^k -1。)所以一般推荐用链式结构存储二叉树。
typedef struct BinaryNode
{
TElemType data; // 数据域
struct BinaryNode *Lchild, *Rchild; //指针域,左右孩子节点指针
// [optional] struct BinaryNode *Parent; 如果需要找到parent节点
}BinaryNode, *BinaryTree;
BinaryNode 用于定义二叉树中的结点;
BinaryTree 用于存储二叉树结构。
(未完待续)