树的学习

树的定义

树(tree)是n(n>=0)个结点的有限集合T,T为空时称为空树,否则它满足如下两个条件:

(1)有且仅有一个称之为根(root)的结点

(2)其余的结点可分为m(m>=0)个互不相交的子集T1,T2,....,Tm,其中每个子集本身又是一棵树,并称之为根的子树(subtree)

注意:

树的递归定义刻画了树的固有特性:一棵非空树若是由若干棵子树构成的,而子树又可以由若干棵更小的树组成


树结构的基本术语

结点的度(degree)

树的结点:包含一个数据元素及若干指向其子树的分支。
结点的度:结点拥有的子树数称为结点的度(degree)
叶子:度为0的结点
分支结点:度不为0的结点

孩子(child)和双亲(parents)

树中某个结点的子树之根称之为该结点的孩子(child),相应的,该结点称之为孩子的双亲(parents)
同一双亲的孩子称为兄弟(sibling)

祖先(ancestor)和子孙(descendent)

路径

若树中存在一个结点序列k1,k2,k3,....,ki,...kj,使得ki是ki+1的双亲,则称该结点序列是从kl到kj的一条路径(path)或道路。
路径的长度即路径所经过的边的数目,等于j-1

祖先和子孙

若树中k到ks存在一条路径,则称k是ks的祖先,ks是k的子孙。
一个结点的祖先是从根结点到该结点路径上所经过的所有结点,而一个结点的子孙则是以该结点为根的子树中的所有结点
约定:
结点k的祖先和子孙均不包括结点k

结点的层数(level)和树的高度(height)

结点的层数(level)从根算起:
根的层数为1
其余结点的层数等于双亲结点的层数+1
树中结点的最大层数称为树的高度(height)和深度(depth)

有序树(orderedtree)和无序树(unorderedtree)

若树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(orderedtree),否则称为无序树(unorderedtree)

森林(forest)

m棵互不相交的树的集合。对树中的每个结点而言,其子树的集合即为森林


二叉树

二叉树定义

二叉树(binary tree)是另一种树形结构,它的特点是每个结点至多只有一棵子树(即二叉树中不存在度大于2的结点);并且,二叉树的子树有左右之分,其次序不能任意颠倒

二叉树的重要性质

(1)在二叉树的第i层上至多有2的(i-1)次方个结点
(2)深度为k的二叉树至多有2的(k)次方-1个结点 (等比数列可证)
(3)对任何一棵二叉树T,若终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1

证明:设结点总数为n,度为1的结点数为n1,则可得公式如下:
n = n1 + n2 + n0
n = 1 * n1 + 2 * n2 + 1

相同项相消即可

(4)具有n个结点的完全二叉树的深度为log2 n + 1

二叉树的存储结构

顺序存储结构

该方法是把二叉树的所有结点按照一定的线性次序存储到一片连续的存储单元中,结点在这个序列中的相互位置还能反应出结点之间的逻辑顺序
完全二叉树的结点编号
编号方法

在一棵n个结点的完全二叉树中,从树根起,自上层到下层,每层从左向右,给所有的结点编号,能得到一个反映整个二叉树结构的线性序列。

编号特点

完全二叉树除最下面一层外,各层都充满了结点。每一层的结点个数恰好是上一层结点个数的2倍。从一个结点的编号九可以推的其双亲,左、右孩子,兄弟等结点的编号。假设编号为i的结点是ki(1 <= i <= n),则有
(1)若i > 1,则ki的双亲编号为 i / 2下整数。若i == 1,则ki是根结点,无双亲
(2)若2i <= n,则ki的左孩子的编号是2i;否则,ki无左孩子,则ki必是叶子。因此完全二叉树编号i > n / 2的结点必是叶子结点。
(3)若2i + 1 <= n,则ki的右孩子编号是2i + 1;否则,ki无右孩子
(4)若i为奇数且不为1,则ki的左兄弟的编号是i - 1,否则, ki无左兄弟
(5)若i为偶数且小于n,则ki的右兄弟是i + 1,否则,ki无右兄弟

完全二叉树的顺序存储
将完全二叉树的所有结点按编号顺序依次存储在一个向量bt[0 ... n]中
其中:
bt[1...n]用来存储结点
bt[0]不用或用来存储结点数目

顺序存储结构:
define MAX_TREE_SIZE 1000	//二叉树的最大结点数
int sqbitree[MAX_TREE_SIZE];	//0号单元存储数量,1号单元开始存储结点

优点和缺点:
(1)对于完全二叉树,顺序存储结构简单又节省存储空间
(2)一般的二叉树,会造成存储空间的浪费

链式存储结构

结点的结构
二叉树的每个结点最多有两个孩子。用链接方式存储二叉树时,每个结点除了存储结点本身的数据外,还应设置两个指针域lchild和rchild,分别指向该结点的左孩子和右孩子。结点的结构为:
| lchild | data | rchild|

结点的类型说明

typedef char DataType;
struct BinTNode
{
	DataType data;
	struct BinTNode *lchild, *rchild;	//左右孩子指针
};
typedef struct BinTNode *BinTree;	//BinTree为指向BinTNode类型结点的指针类型


你可能感兴趣的:(学习)