数据结构与算法知识总结(下)

(作者:咸鱼;撰写时间:2020年5月7日)
一、树的定义和基本术语
1、定义:树是由n(n>=0)个结点组成的有限集何T。如果n=0,称为空树,如果n>0则满足:
(1)、有一个特定的称为根(root)的结点,它只有直接后继,但没有直接前趋;
(2)、除根以外的其他结点划分为m(m>0)个互不相干的有限集何T1,T2,…,Tm,每个集合又是一棵树,并且称之为根的子树(subTree)。
每棵子树的根节点有且仅有一个直接前趋,但可以有0个或多个直接后继。
2、基本术语
(1)、节点(node):包含一个数据元素及若干个指向其子树的分支;
(2)、节点的度(degree):节点的子树的个数;
(3)、树的度(degree):树中节点度的最大值;
(4)、叶子(leaf):度为零的节点;
(5)、分支(branch):度不为零的节点;
(6)、孩子(child):某节点的各子树的根;
(7)、双亲(parent):该节点的直接前趋的节点;
(8)、兄弟(sibling):具有相同双亲的节点;
(9)、有序树和无序树:如果树中每个节点的各个子树是从左到右的有次序;
(10)、森林:m(m>=0)根互不相交的树的有限集合;
(11)、树的深度:树中所有节点的最大层数,也称树的“高度”。
3、二叉树(最简单的树型结构,一般树与二叉树可以互相转换)
(1)、定义:二叉树(Binary Tree)是n(n>=0)个节点的有限集合BT,它或者是空集,或者由一个根节点和两棵分别称为左子树和右子树的互不相交的二叉树组成。
其特定的每个节点至多有两棵子树(即不存在度大于2的节点);二叉树的子树有左、右之分,且其次序不能任意颠倒,因此二叉树有五种基本形态,如下图所示。
在这里插入图片描述
(2)、基本操作
A、初始化InitTree(BT):将二叉树BT初始化为一棵空树;
B、判断二叉树是否为空TreeEmpty(BT):判断一棵树BT是否为空,若为空,返回真,否则返回假;
C、求根节点Root(BT):返回树BT的根节点;
D、求双亲节点Parent(BT,x):返回二叉树BT中x的双亲节点,如果x为根节点,则返回空;
E、求二叉树的高度Depth(BT):返回二叉树BT的高度(深度);
F、求节点的左孩子LChild(BT,x):返回二叉树BT中节点x的左孩子节点,若节点x为叶子或x不在二叉树BT中,则返回值为“空”;
G、求节点的右孩子RChild(BT,x):返回二叉树BT中节点x的右孩子节点,若节点x为叶子或x不在二叉树BT中,则返回值为“空”;
H、遍历二叉树Traverse(BT):从根节点开始,按照一定的次序访问二叉树BT中所有的节点。
(3)、二叉树的性质
A、性质1:在二叉树的第i层上至多有2^i-1 个节点(i>=1);
B、性质2:深度为k的二叉树至多有2^k-1(k>=1) 个节点;
C、性质3:对任意一棵二叉树BT,如果其叶子个数为n0,深度为2的节点个数为n2,则n0 = n2 + 1;
D、性质4:具有n个节点的完全二叉树的深度为:[log2 n ]+1。
E、性质5:如果对一棵有n个节点的完全二叉树(其深度为[log2 n ]+1)的节点按层序编号,其中根节点为第一层,按层次从上到下,同层从左到右,则对任一编号为i(1<=i<=n)的节点有以下性质:
a、如果i=1,则节点i是二叉树的根,无双亲;如果i>1,则其双亲是[i/2]。
b、如果2i>n,则节点i无左孩子,即该节点为叶子节点;如果2i<=n,则其左孩子是2i。
c、如果2i+1>n,则节点i无右孩子;如果2i+1<=n,则其右孩子是2i+1。
(4)、两种特殊形式的二叉树
A、满二叉树:指深度为k且有2^k-1个节点的二叉树;特点:每一层上的节点数都是最大节点数。
在这里插入图片描述
B、完全二叉树:指深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1至n的节点一一对应时,称完全二叉树。特点:叶子节点只可能在层次最大的两层上出现,对任一节点,若其右分支下的子孙最大层次是L,则其左分支下的子孙最大层次必定为L或L+1。
在这里插入图片描述
注意:满二叉树必为完全二叉树,完全二叉树不一定是满二叉树。
(5)、遍历二叉树
A、定义:以某种次序访问二叉树的每一个节点,且每个节点仅被访问一次。
B、三种遍历次序:先根遍历(TLR)
中根遍历(LTR)
后根遍历(LRT) 在这里插入图片描述
第一次经过时访问的节点是:A、B、D、C——先根遍历
第二次经过才访问的节点是:B、D、A、C——中根遍历
第三次经过才访问的节点是:B、D、C、A——后根遍历
(6)、二叉树的存储结构(创建二叉树)
A、顺序存储结构:用一组连续的存储单元存放二叉树中的元素,即满二叉树的形式存放在一维数组中,示例如下。
在这里插入图片描述
B、链式存储结构:最常用的是二叉链表和三叉链表,二叉链表的每个节点有一个数据域和两个指针域,一个指针指向左孩子,另一个指向右孩子。
在这里插入图片描述
(7)、哈夫曼树的基本概念
A、路径长度:两个节点之间的路径长度是连接两个节点的路径上的分支数。
B、树的路径长度:根节点到各节点的路径长度之和。
C、节点的带权路径长度:从根节点到某个节点的路径长度与该节点所带的权值的乘积。
D、树的带权路径长度:树中所有叶子节点的带权路径长度之和,通常记作:
在这里插入图片描述
E、哈夫曼树的定义:假设有n个权值{W1,W2,…,Wn},试构造有n个叶子节点的二叉树,每个叶子节点拥有一个权值W,则其中带权路径长度WPL最小的二叉树,则为最优二叉树或哈夫曼树。哈夫曼树中,权值最大的节点离根最近。
二、图的基本概念
1、图的定义:图(Graph)是由顶点和边组成,顶点表示图中的数据元素,边表示数据元素之间的关系,记为G=(V,E),其中V是顶点的非空有穷集合,E是用顶点对表示的边的非空有穷集合,可以为空。
若G图中表示边的顶点对是无序的,即称无向边,则称G图为无向图。通常用(Vi,Vj)表示顶点Vi和V间的无向边。
若G图中表示边的顶点对是有序的,即称有向边,则称G图为有向图。通常用(Vi,Vj)表示顶点Vi和V间的有向边,有向边<Vi,Vj>也称弧,顶点Vi称为弧尾(或起始点),顶点Vj称为弧头(或终点),可用由弧尾指向弧头的箭头形象地表示弧,显然,在有向图中,<Vi,Vj>和<Vj,Vi>表示两条不同的弧。
示例:下图中,图G1为无向图,图G2为有向图。
在这里插入图片描述
2、图的基本术语
(1)、邻接点:在无向图G=(V,E)中,若边(Vi,Vj)属于E,则称Vi和Vj互为邻接点,或Vi与Vj相邻接,并称边(Vi,Vj)与顶点Vi和Vj相关联,或者说边(Vi,Vj)依附于顶点Vi,Vj。在有向图G=(V,E)中,若弧<Vi,Vj>属于E,则称顶点Vi邻接到顶点Vj,顶点Vj邻接自顶点Vi,并称弧<Vi,Vj>与顶点Vi,Vj相关联。
(2)、顶点的度,入度和出度:顶点Vi的度(Degree)是图中与Vi相关联的边的数目,记为TD(Vi)。
(3)、完全图、稠密图、稀疏图:若无向图中有1/2n(n-1)条边,即图中的每对顶点之间都有一条边,则称该图为无向完全图。若有向图中有n(n-1)条弧,即图中的每对顶点之间都有方向相反的两条弧,则称该图为有向完全图。有很少条边或弧的图称为稀疏图,反之为称稠密图。
在这里插入图片描述
(4)、子图:假设有两个图G=(V,E)和G’=(V’,E’),若V’真含于V,E’真含于E,则称图G’是图G的子图,如下图所示。
在这里插入图片描述
(5)、路径:无向图G=(V,E)中,从顶点V到V’之间的路径是一个顶点序列(V=Vi0,Vi1,…,Vim = V’),其中(Vij-1,Vij)属于E,1<=j<=m;若G是有向图,则路径也是有向的,且<Vij-1,Vij>属于E,1<=j<=m。路径上边或弧的数目称为路径长度。如果路径的起点和终点相同(即V=V’),则称此路径为回路或环。序列中顶点不重复出现的路径称为简单路径。除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。
(6)、连通图、联通分量:在无向图G中,若从顶点Vi到V j(i=/=j)有路径相通,则称V i和Vj是联通的。如果图中任意两个顶点Vi和Vj(i=/=j)都是联通的,则称该图为联通图。无向图中极大联通子图称为联通分量。对于联通图,其联通分量只有一个,那就是它本身。对于非联通图,其联通分量可以有多个。例如,下图(a)是一个非联通图,它有三个联通分量图(b)所示。
在这里插入图片描述(7)、强连通图、强连通分量:在有向图中,若任意两个顶点Vi和Vj都联通,即从Vi到Vj和Vj到Vi都有路径相通,则称该有向图为强连通图。有向图中的极大强连通子图称为该有向图的强连通分量。
(8)、权、网:图的每一条边或弧上常常附有一个具有一定意义的数值,这种与边或弧相关的数值称为该边(弧)的权。这些权可以表示顶点之间的距离、时间成本或经济成本等信息。边或弧上带权的连通图称为网。如下图所示。
在这里插入图片描述
3、图的存储结构(邻接矩阵和邻接表形式的存储)
(1)、邻居矩阵
A、概念:采用两个数组来表示图,一个是一维数组,存储图中所有顶点的信息;另一个是二维数组,即邻接矩阵,存储顶点之间的关系。
B、特点:
a、无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。因此,用邻接矩阵来表示一个具有n个顶点的有向图时需要n^2个单元来存储邻接矩阵;对于无向图,由于其对称性,可采用压缩存储的方式,只需存入上(或下)三角的元素,故只需n(n-1)/2个单元。
b、对于无向图,邻接矩阵的第i行(或第i列)非零元素的个数刚好是第i个顶点的度TD(Vi);对于有向图,邻接矩阵的第i行非零元素的个数刚好是第i个顶点的出度OD(Vi),第i列非零元素的个数刚好是第i个顶点的入度ID(Vi)。
c、对于无向图,图中边的数目是矩阵中1的个数的一半;对于有向图,图中弧的数目是矩阵中1的个数;
d、从邻接矩阵很容易确定图中任意两个顶点间是否有边相连,如果第i行j列的值为1,表示顶点i与顶点j之间有边相连。
(2)、邻接表(将数组与链表相结合的存储方法称为邻接表)
A、在邻接表中,对图中的每个顶点建立一个单链表,链表的每个节点代表一条边,叫做表结点,节点中保存与该边相关联的另一个顶点的顶点下标adjvex和指向同一链表中下一个表结点的指针nextarc,如下图(a)所示。第i个单链表中的节点表示依附于顶点Vi的所有的边(对有向图是以顶点Vi为弧尾的弧),每个链表上附设一个表头结点,结点中存储顶点Vi的有关信息data和指向链表表中第一个表结点的指针firstarc,如下图(b)所示。
在这里插入图片描述
4、图的遍历
(1)、定义:从图中某一顶点出发遍历图中其余顶点,且使每一顶点仅被访问一次。
(2)、遍历图的基本方法:深度优先搜索DFS(Depth First Search)
广度优先搜索BFS(Breadth First Search)
(3)、图的任一顶点都可能和其余顶点相邻接,且可能存在回路,因此在访问完某个顶点之后可能沿着某些边又回到了曾经访问过的顶点,为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组visited[],它的初始状态为0,在图的遍历过程中,一旦某个顶点Vi被访问,就立即让visited[i]置为1,防止它被多次访问。
5、最短路径问题
(1)、如果从图中某一顶点(称为原点)到达另一顶点(称为终点)的路径可能不仅一条,如何找到路径使得沿着这条路径上各边上的权值总和达到最小。
(2)、问题解法:
A、边上权值非负情形的单源最短路径问题——迪杰斯特拉算法(Dijkstra)
B、所有顶点之间的最短路径——弗勒伊德算法(Floyd)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值