树:
树(Tree)是n(n>=0)个节点的有限集。n=0时称为空树。在任意一棵飞空树中:
(1)有且仅有一个特定的被称为“根”(Root)的结点。
(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、T3、.......Tm,其中每一集合本身又是一棵树,并且称为根的子树(subTree)。
根:A {B CD}T1{C F G}T2称为A的子树。
对于树的定义还需要强调两点:
(1)n>0时根结点时唯一的,不可能存在多个根结点。
(2)m>0时,子树的个数没有限制,但他们一定是互不相交的。
结点的分类:
度:结点拥有的子树数称为结点的度(Degree)。
度为0的结点称为叶结点或终端结点。
度不为0的结点称为非终端结点或分支结点。除根结点外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。
结点之间的关系:
结点的子树的根称为该结点的孩子,该结点称为孩子的双亲。同双亲的孩子结点之间互称为兄弟,结点的祖先是从根到该结点所经分支上的所有结点。已某个结点为根的子树中的任一结点都称为该节点的子孙。
如果将树中各自子树看成从左至右是有次序的,不能互换的,则称为该树为有序树,负责称为无序树。
森林是m(m>0)棵互不相交的树的集合。
线性结构 | 树结构 |
第一个数据元素:无前驱 | 根结点:无双亲,唯一 |
最后一个元素:无后继 | 叶结点:无孩子,可以多个 |
中间元素:一个前驱一个后继 | 中间结点:一个双亲多个孩子 |
树的存储结构:
(1)线性结构存储
(2)链式结构存储
(1)线性结构存储:双亲表示法,孩子表示法、孩子兄弟表示法。
双亲表示法:在每个节点中,附加一个指示器指示双亲结点到链表中的。
data(数据) | 双亲所在位置的下标 |
孩子表示法:每个结点的孩子排列起来,一单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一位数组中。
所在位置的下标 | 兄弟的地址 |
双亲结点数据结构
data(数据)第一个孩子的地址
孩子兄弟表示法:任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该结点的第一个结点和此结点的右兄弟。
data | firstChild | rightSib |
通过这种方式可以将一棵普通的树,转化为二叉树。