赞
踩
本部分主要介绍树的相关知识,将分为3篇博文介绍。 本文将着重介绍二叉树的一些基本概念,以及在其基础上的一些特殊的树形式:满二叉树、完全二叉树、线索二叉树、二叉排序树、平衡二叉树等。
树是 N ( N ≥ 0 ) N(N \ge 0) N(N≥0)个结点的有限集合, N = 0 N=0 N=0时,称为空树。 N N N不为0时,树满足:
树是一种递归的数据结构,具有以下2个特点:
把树的根结点删去就成了森林。
定义根结点的编号为1
与树类似,二叉树也以递归的形式定义。二叉树是 n ( n ≥ 0 ) n(n \ge 0) n(n≥0)个结点的有限集合:
二叉树中每个结点至多有2棵子树,其结点次序是确定的,不是相对另一结点而言。
一棵高度为
h
h
h,并且含有
2
h
−
1
2^h-1
2h−1个结点的二叉树称为满二叉树。(定义根结点的编号为1)起,
对于编号为
i
i
i的结点:
高为 h h h,有 n n n个结点的二叉树,当且仅当每一个结点都与高为 h h h的满二叉树中编号为 1 到 n 1到n 1到n的结点一一对应时,称为完全二叉树。
完全二叉树的性质
下面是一张满二叉树和完全二叉树的对比图:
一棵二叉树:
树上任一结点的左子树和右子树的深度之差不超过1。
满二叉树 -----> 完全二叉树 -----> 平衡二叉树
二叉树的顺序存储结构就是用一组连续地址的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为 i i i的结点元素存储在某个数组下标为 i − 1 i-1 i−1的分量中。(数组下标要从1开始)
依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,因为树中结点的序号可以唯一的反映出结点之间的逻辑关系,这样既能最大的节省存储空间,又可以利用数组元素下标确定结点在二叉树中的位置,以及结点之间的关系。
如果对于一般的二叉树,也采用顺序存储的话,只能添加一些并不存在的空结点,这样才能满足我们上面所讲的逻辑关系。
如下图所示,其中 0 0 0表示并不存在的空结点。
由于顺序存储对空间利用效率低,因此一般二叉树都采用链式存储结构。链式结构是指用一个链表来存储一棵二叉树,二叉树中的每一个结点用链表的一个链结点来存储。在二叉树中,结点结构通常包括若干数据域及若干个指针域。二叉链表至少包含3个域:数据域 d a t a data data、左指针域 l c h i l d lchild lchild和右指针域 r c h i l d rchild rchild。如下图所示:
二叉树的链式存储结构描述如下:
typedef struct BiTNode{
ElemType data; //数据域
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
在含有 n n n个结点的二叉链表中含有 n + 1 n+1 n+1个空链域。如上图中含有5个结点的二叉链表有6个空链域。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。