数据结构学习记录:树

218 阅读3分钟

一、基础知识

:是n个结点的有限集。n=0时称为空树。

非空树
(1)有且仅有一个特定的称为根的结点。
(2)n>1时,其余结点可分为m(m>0)个互不相交的有限集,而其中每个集合本身又为一棵树,称为根的子树。

结点分类:结点拥有的子树成为结点的度。度为0的结点为叶结点或终端结点。度不为0的结点成为非终端结点或分支结点,包括根结点。除根结点外度不为0的结点也可叫内部结点。以各结点中度最大的结点度作为该树的度。

结点间关系:一结点的子树的根为该结点的孩子。该结点成为孩子的双亲。同一双亲的孩子结点之间为兄弟。结点的祖先则为从根到该结点所经分支上的所有结点。以某一结点为根结点的子树中任一结点都为该结点的子孙。

结点的层次:根为第一层,往下依次序为第二层,第三层……树中结点的最大层次称为树的深度或高度。 如果将树中结点各子树看成从左至右是有次序的,不能互换的,则该树为有序树,否则称为无序树。森林为m棵互不相交的树的集合。例如:树中每个结点的子树的集合即为森林。

二、树的抽象数据类型

ADT(tree)
Data
    树是由一个根结点和若干棵子树构成。树中结点具有相同数据类型及层次关系。
Operation
InitTree(*T)/* 构造空树 */
    DestroyTree(*T)/* 销毁树 */
    CreateTree(*T,definition)/* 按definition中给的定义构造树 */
    TreeEmpty(T)/* 判断树是否为空 */
    TreeDepth(T)/* 返回树的深度 */
    Root(T)/* 返回树的根结点 */
    Value(T,cur_e)/* 返回结点cur_e的值 */
    Assign(T,cur_e,value)/* 给结点cur_e赋值 */
    Parent(T,cur_e)/* 若cur_e不为根结点,返回结点cur_e的双亲,否则返回空 */
    LeftChild(T,cur_e)/* 若cur_e不是叶结点,返回它最左的孩子,否则返回空 */
    RightSibling(T,cur_e)/* 若cur_e有右兄弟,返回它的右兄弟,否则返回空 */
    InsertChild(*T,*p,i,c)/* p指向树T的某个结点,i为结点p的度+1,非空树c与T不相交,操作结果为插入c为树T中p所指结点的第i棵子树 */
    DeletChild(*T,*p,i)/* p为树T的某个结点,i为所指结点的度,操作结果为删除树T中p所指结点的第i棵子树 */

三、树的存储结构

(1)双亲表示法
(2)孩子表示法
(3)孩子兄弟表示法

四、二叉树的性质

1、二叉树的第i层至多有2i-1个结点。
2、深度为k的二叉树至多有2k-1个结点。
3、对任何一棵二叉树T,如果终端为n0,度为2的结点数为n2,则n0=n2+1。
4、具有n个结点的完全二叉树的深度为[log2n]+1。([x]表示不大于x的最大整数)
5、如果对一棵树有n个结点的完全二叉树(深度为[log2n]+1)的结点按层序编号,对任一结点i都有:
(1)i=1,结点i是二叉树的根,无双亲;i>1,其双亲为[i/2]。
(2)2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i。
(3)2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。