2012-02-02

来源:互联网 发布:科幻悬疑 知乎 编辑:程序博客网 时间:2024/04/26 23:01

8.2 数组、矩阵、广义表

数组与广义表可看做是线性表的推广。

1.数组的定义及基本运算

1)数组的定义

数组结构的特点。

数组元素数目固定、数组元素具有相同的类型、数组元素的下标关系具有上下界的约束且下标有序。

数组的两个基本运算。

2.数组的顺序存储

数组一般不做插入和删除操作,适合采用顺序存储结构。

通过递推关系将多维数组的数据元素排成一个线性序列。

8.2.2 矩阵

在数据结构中,主要讨论如何在节省存储空间的情况下,使矩阵的各种运算能高效的进行。

特殊矩阵(稀疏矩阵):矩阵中的元素的分布有一定的规律

对称矩阵、三角矩阵和对角矩阵。

三元组顺序表

8.2.3 广义表

1.定义

广义表是线性表的推广,是由0个或多个单元素或子表组成的有限序列。

记为:LS = (α1,α2,...,αn)

原子和子表

广义表的长度:广义表中元素的个数

广义表的深度:广义表展开后所含的括号的最大层数。

2.广义表的基本操作

取表头head(LS):

取表尾tail(LS):

3.广义表的特点

可以是多层次结构

元素可以使已经定义的广义表的名字,可被其他广义表共享

可以是一个递归的表

4.广义表的存储结构

通常采用链式存储结构。

一对确定的表头和表尾可以唯一确定一个广义表。

8.3 树

有两个或两个以上的直接后继元素,可以描述客观世界中广泛存在的层次结构关系。

8.3.1 树及二叉树的定义

1.树的定义

非空树有且仅有一个节点称为根。

树的基本概念:

双亲、孩子和兄弟:

节点的度:一个节点的子树的个数

叶子节点:度为0的节点

内部节点:

节点的层次:

树的高度:

有序(无序)树:

3.二叉树的定义:

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

二叉树节点的最大度为2.

8.3.2 二叉树的性质及存储结构。

1.二叉树的性质

二叉树的第i层上最多有2^(i-1)个节点

高度为k的二叉树至多有2^k-1个节点。

对于任意一棵二叉树,若终端节点数位n,度为2的节点数为m,则n=m+1

具有n个节点的完全二叉树的深度:log2n+1




2.二叉树的存储结构

1)。二叉树的顺序存储结构

完全二叉树采用顺序结构既简单又节省空间,一般二叉树不宜采用顺序存储结构。

2)。二叉树的链式存储结构

typedef struct BiTnode{int data;struct BiTnode *lchild,rchild;}BiTnode,*BiTree;


8.3.3 二叉树的遍历

遍历是按某种策略访问数中的每个节点,且仅访问一次的过程。

二叉树的先序遍历

void PreOrder(BiTree root){if (root != NULL ){printf("%d",root->data);/*访问根节点*/PreOrder(root->lchild);/*先序遍历根节点的左子树*/PreOrder(root->rchild);/*先序遍历根节点的右子树*/}}void InOrder(BiTree root){if (root!=NULL){InOrder(root->lchild);printf("%d",root->data);/*访问根节点*/InOrder(root->rchild);}}void PostOrder(BiTree root){if (root!=NULL){PostOrder(root->lchild);PostOrder(root->rchild);printf("%d",root->data);/*访问根节点*/}}

时间复杂度为O(n)

/*二叉树的中序非递归遍历*/void InOrderTraverse(BiTree root){BiTree p,q;stack<BiTree> St;p=root;/*p指向根节点*/while (p!=NULL||!St.empty()){if(p!=NULL)/*不是空树*/{St.push(p);/*根节点指针入栈*/p=p->lchild;/*进入根节点左子树*/}else{q=St.top();/*栈顶元素出栈*/St.pop();/*访问根节点*/printf("%d",q->data);/*进入根节点右子树*/p=q->rchild;}}}

/*二叉树的层序遍历算法*/void LevelOrder(BiTree root){BiTree p;queue<BiTree> q;q.push(p);while (!q.empty()){p=q.front();q.pop();printf("%d",p->data);if (p->lchild){q.push(p->lchild);}if (p->rchild){q.push(p->rchild);}}}


原创粉丝点击