严蔚敏视频 笔记15
三、十字链表
增加两个指针
一个指示同一行下一个非零元
一个指示同一列下一个非零元
非零元个数有增减时很方便
typedef struct OLNode {
int i,j; // 该非零元的行和列下标
ElemType e;
struct OLNode *right, *down; // 该非零元所在的行表和列表的后继链域
} OLNode, *OLink;
typedef struct {
OLink *rhead,*chead; // 行和列链表头指针向量基址由CreateSMatrix分配
int mu,nu,tu; // 稀疏矩阵的行数、列数喝非零元的个数
} CrossList;
矩阵加法 逐行处理
算法:修改指针
数组部分小结:
1.了解数制的两种存储表示方法,掌握数组在以行为主的存储结构中的地址计算方法
2.掌握对特殊矩阵进行压缩存储时的下表变换公式
3.了解稀疏矩阵的两种压缩存储方法的特点和适用范围,领会以三元组表示时进行矩阵运算采用的处理方法
广义表图以后再讨论
第六章 树和二叉树
6.1 树的类型定义
ADT Tree {
数据对象:
D是具有相同特性的数据元素的集合
数据关系:
若D为空集,则为空树
否则:
(1)D中存在唯一的称为根的数据元素root
(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…Tm,其中每一棵子树本身又是一棵符合本定义的树,称为根root的子树
基本操作:
查找:
Root(T);
Value(T,cur_e);
Parent(T,cur_e);
LeftChild(T,cur_e);
RightSibling(T,cur_e);
TreeEmpty(T);
TreeDepth(T);
TraverseTree(T,Visit());
插入:
InitTree(&T);
CreateTree(&T,definition);
Assign(T,cur_e,value);
InsertChild(&T,&p,i,c);
删除:
ClearTree(&T);
DestroyTree(&T);
DeleteChild(&T,&p,i);
}
基本术语
结点:数据元素+若干指向子树的分支
结点的度:分支的个数
树的度:树中所有结点的度的最大值
叶子结点:度为零的结点
分支结点:度大于零的结点
从根到结点的路径:由从根到该结点所经分支和结点构成
孩子结点、双亲结点、兄弟结点、祖先结点、子孙结点
结点的层次:假设根结点的层次为1,第l层的结点的子树根结点的层次为1+l
树的深度:树中叶子结点所在的最大层次
森林:是m(m>=0)棵互不相交的树的集合
任何一棵非空树是一个二元组
Tree=(root,F)
root为根结点 F为子树森林
有向树:
1)有确定的根
2)树根和子树根之间为有向关系
有序树和无序树的区别在于:
子树之间是否存在次序关系
通常讨论的是无序树
和线性结构比较:
线性结构 树结构
第一个数据元素(无前驱) 根结点(无前驱)
最后一个数据元素(无后继) 多个叶子结点(无后继)
其他数据元素(一个前驱一个后继) 树中其他结点(一个前驱多个后继)
6.2 二叉树的类型定义
二叉树或为空树;或是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成
二叉树有五种基本形态
空树 一个根结点 只有左子树 只有右子树 有左右子树
概念也不同于有序树