串和树1

131 阅读3分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。

由零个或多个字符组成的有限序列就叫做串。 s = "a1a2a3......an"(n>=0)

s是串的名称,n为串的长度。零个字符的串称为空串。

串的顺序存储结构

用一组地址连续的存储单元来存储串中的字符序列。按照预定义的大小,为每个定义串的变量分配一个固定长度的存储区,一般用定长数组来固定。当然也可以用动态的数组分配,但是相当麻烦,所有一般就用定长的来固定。

计算机中存在一个自由存储区'堆'。这个堆可由动态分配函数malloc()和free()管理。这两个函数是C语言中常常使用的。

树是n个结点的有限集。n=0时称为空树。n!=0时,树有且只有一个特定的称为根的结点。 n>1时,其余节点可分为多个互不相交的有限集,其中每个集合本身又是一个树,称为根的子树。

树的结点包含一个数据元素和若干个指向其子树的分支。结点拥有的子树称为结点的度。度为0的结点称为叶节点或终端结点,度不为0的结点称为非终端结点或分支结点。除根节点外,分支节点也是内部节点。树的度是树内各结点的度的最大值。

结点的层次从根开始定义起,根为第一层,根的孩子为第二层。双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的高度或深度。

森林是n个互不相交树的集合(n>=0) 森林呢,平时学习的时候接触的并不是很多。 还有一个KMP算法,非常有意思,感兴趣可以搜寻一下。

线性结构和树结构的对比:

线性结构:
    第一个数据元素:无前驱。
    最后一个数据元素:无后继。
    中间元素:一个前驱一个后继。
树结构:
    根节点:无双亲,唯一
    叶节点:无孩子,可以多个
    中间结点:一个双亲多个孩子

树的存储结构

双亲表示法

在每个节点中,附设一个指示器指示其双亲结点在数组中的位置。

存储结构的设计是一个比较灵活的过程。一个存储结构设计的是否合理,取决于基于该存储结构的运算是否合适,是否方便,时间复杂度好不好等。这个关系到计算机内部的存储效率问题,一个好的存储结构能极大的提高计算机的存储效率,可以节省空间,避免浪费,方便查找等等。

孩子兄弟表示法

任意一棵树中,其结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。

typedef struct CSNode
{
    TElemType data;
    struct CSNode *firstchild,*rightsib;
}CSNode,*CSTree;

二叉树

n个结点的有限集合,该集合或者为空集,或由一个根节点和两颗互不相交的、分别称为根节点的左右子树的二叉树组成。

二叉树有五种形态:

1.空二叉树。
2.只有一个根节点。
3.根节点只有左子树。
4.根节点只有右子树。
5.根节点既有左子树又有右子树。
其实还能分为完全二叉树,非完全二叉树。

二叉树是数据结构中非常重要的一个知识点,也非常简单。