了解树结构
在了解树结构之前,想必应该对链式结构和数组有了一定的了解,树的结构是也是一种特定的元素序列的集合,定义:树是非线性结构,它是由n(n>=0)个有限结点组成的集合,当n等于0时,称之为空树,在任意非空树中:
- 有且只有一个特定的称之为根(root)的结点
- 其余结点可以分为m个互不相交的有限集合
- 这些有限集合可以看作是新的树,并且称为根的子树
树结构的基本名称
结点的度:一个结点含有子树的个数称为该结点的度;
树的度:一棵树中,所有结点度的最大值称为树的度;
叶子结点或终端结点:度为0的结点称为叶结点;
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;
根结点:一棵树中,没有双亲结点的结点;其中一棵不为空树的树,根结点是唯一的,不存在有很多根节点
树的高度或深度:树中结点的最大层次;
非终端结点或分支结点:度不为0的结点;
兄弟结点:具有相同父结点的结点互称为兄弟结点;
堂兄弟结点:双亲在同一层的结点互为堂兄弟;
结点的祖先:从根到该结点所经分支上的所有结点;
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。
森林:由m(m>=0)棵互不相交的树组成的集合称为森林
树的储存形式
树在内存中的储存形式有很多种,包括孩子表示法、双亲表示法、孩子双亲表示法、孩子兄弟表示法等等,不用的储存方式有着不同的优点,就比如双亲表示法,其子节点内存有双亲结点的地址,能够在时间复杂度为O(1)的情况下,访问到双亲结点,但是想要知道孩子结点,必须要访问整个结点。但是各种表示法都有一定缺点,接下来重点讲孩子兄弟表示法,这种方法给找某个结点的孩子带来了方便
但是如果想要想到这个结点的双亲结点,显然也是比较麻烦的,如果实在有必要,可以增加一个parent指针域来解决这个问题