软考必考之算法

• 树
• 树状图:是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。它具有以下的特点:
• 每个节点(node)有零个或多个子节点;
• 没有父节点的节点称为根节点;
• 每一个非根节点有且只有一个父节点;
• 除了根节点外,每个子节点可以分为多个不相交的子树;
• 如图所示:
这里写图片描述

• 相关概念:
• 节点的度:一个节点含有的子树的个数称为该节点的度;
• 树的度:一棵树中,最大的节点的度称为树的度;
• 叶节点或终端节点:度为零的节点;
• 非终端节点或分支节点:度不为零的节点;
• 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
• 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
• 兄弟节点:具有相同父节点的节点互称为兄弟节点;
• 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
• 树的高度或深度:树中节点的最大层次;
• 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
• 节点的祖先:从根到该节点所经分支上的所有节点;
• 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
• 森林:由m(m>=0)棵互不相交的树的集合称为森林;
• 树的种类
• 无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;【信息传播图】
• 有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;
二叉树:每个节点最多含有两个子树的树称为二叉树;
§ 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;【倒数第一层不是倒数第二层的二倍,尚缺N个节点】
§ 满二叉树:对于上述的完全二叉树,如果去掉其第d层的所有节点,那么剩下的部分就构成一个满二叉树(此时该满二叉树的深度为d-1);【倒数第一层是倒数第二层的二倍】
○ 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;【学过信息论的都知道霍夫曼编码,老NB了】
○ B树 【每一层数据大小有序】
• 二叉树
• 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2i-1个结点;深度为k的二叉树至多有2k-1。对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2 +1。
• 树和二叉树的三个主要差别:
• 树的结点个数至少为1,而二叉树的结点个数可以为0;
• 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;【度数即某节点的子节点个数】
• 树的结点无左、右之分,而二叉树的结点有左、右之分。
• 访问二叉树
• L、D、R分别表示遍历左子树、访问根结点和遍历右子树。那么根据排列组合,有6种可能。根据根的位置,常见以下三种遍历方法。先中后是相对根节点说的。
• 前(先)序遍历
• 先(根)序遍历二叉树的顺序是DLR。【注意都是先L后R。】—–以下三张图片来源于课件
这里写图片描述

• 解释:每个节点都用DLR的顺序遍历。下同。
• 中序遍历
• 中(根)序遍历二叉树的顺序是LDR。【注意都是先L后R。】
这里写图片描述

• 后序遍历
• 后(根)序遍历二叉树的顺序是LRD。【注意都是先L后R。】
这里写图片描述

• 例子
• 例子来源于互联网及课件,分析为博主所写,如有错误,恳请指正。
• 例1:
这里写图片描述

• 先序遍历(根左右DLR):ABDEC
• 中序遍历(左根右LDR):DBEAC
• 后序遍历(左右根LRD):DEBCA
• 例2:
这里写图片描述

• 先序遍历(根左右DLR):ABCDEFGHK 【最简单的。先把根写下来,再写左子树的根,如果左子树还有子树,继续往下找,直到叶子节点!因为根左右,先写根,即遇到的就写下来!只需要注意同层的先写左,左如果有子树,继续遍历其子树。】
• 中序遍历(左根右LDR):BDCAEHGKF 【不好写,容易犯错。从左子树开始寻找,子树里面还有子树,继续寻找其左子树,直到遇到叶子节点(D)或者没有左子树(B)写下来。例子里B没有左子树,所以先写,然后遍历右子树,右子树也从其左子树开始遍历,所以是BCD;相对根节点,左子树遍历完成,所以是BDCA;接下来遍历根节点的右子树,按上述步骤,既是:E(其没有左子树)H(叶子节点,其没有左子树,且是G的L)G(自身为根D)K(相对于节点G,其为R)G(G为F的L)F】
• 后序遍历(左右根LRD):DCBHKGFEA 【先左子树,再右子树,最后根节点;没有左子树,则寻找此节点的右子树,在右子树里再按照LRD的顺序找,直到找到叶子节点(概念在上面),开始回溯写下来,相当于堆栈!】
• 例3:
• 怎么根据前序中序求后序:
• 已知前序遍历为GDAFEMHZ,中序遍历为ADEFGHMZ,请画出这棵二叉树。
• ①根据前序遍历特征,我们知道根结点必在首位置,所以为G;
• ②根据中序遍历特征。其中根节点G左侧的ADEF必然是根节点的左子树,G右侧的HMZ必然是根节点的右子树;
• ③根据前序中序特征,重复以上步骤。递归找到子树根节点;
• 那么,我们可以画出这个二叉树:
这里写图片描述

• 由图可知,后序遍历顺序为:AEFDHZMG
• 怎么根据后序中序求前序:
• 已知一棵二叉树的中序序列和后序序列分别是BDCEAFHG 和 DECBHGFA,请画出这棵二叉树。
• 分析:
• ①由后序遍历特征,根结点必在后序序列尾部(即A);
• ②由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树的子孙(即BDCE),其右部必全部是右子树的子孙(即FHG);
• ③递归找出子树根节点。
• 那么,我们可以画出这个二叉树:
这里写图片描述

• 注意事项:
• 左子树中序为BDCE,后序为DECB,说明B为A的左子树根节点,C为B的右子树(从BDCE看出)根节点(从DCE及DEC看出);
• 右子树中序为FHG,后序为HGF,说明F为A的右子树的根节点,H为G的左子树根节点。


• 算法
• 算法是一系列解决问题的清晰指令,能够对一定规范的输入,在有限时间内获得所要求的输出。
• 由于算法是为计算机程序设计的,因此最终一定要由计算机程序实现
• 算法的特性:有穷性、确定性、输入、输出、可行性。
• 常见算法:递推法(是利用问题本身所具有的递推关系求问题的一种方法。即程序可以从i=0或i=1出发,重复地由已知至i-1规模的解,通过递推获得规模为i的解,直至得到规模为N的解;)、递归(为求解问题规模为N的问题,可以将原问题分解成问题规模较小的问题,然后从这些较小规模问题的解可以构造出原问题的解。当规模N=1时,能直接得解。因此递归分为分解问题的过程和回归两个阶段)、迭代法(适用于求方程近似根或方程组近似解,即:首先确定根的大致范围,例如[a,b],使所求的根在这个区间内为唯一实根,随后逐步改善根的近似值的精确度。一般用二分法逐步求精)、贪心法(在每一步选择中都采取在当前状态下最优的选,从而追求全局最优解的算法,贪心法不需要回溯)、分治法(把一个复杂问题分解成两个或跟多的相同或相似的子问题,可以继续分,最后各个击破,这个算法是很多高校算法的基础。)
• 图
• 图的基本概念:根据边是否区分方向,图可以分为每条边都有方向的三维有向图和每条边都不区分方向的无向图。
• 若有向图中有n个顶点,则最多有n*(n-1)条弧,即称为有向完全图,对于无向图而言,如果任意两个结点之间都有边相连,则称为无向完全图,有n*(n-1)/2条边。
• 图的存储结构
• 图的邻接矩阵表示法:图是由固定的顶点和顶点之间的边所定义,那么对一个有n个顶点的图来说,只需要采用n*n的矩阵保存边即可。另外,无向图的邻接矩阵一定是对称矩阵。
• 图的遍历:主要由深度优先和广度优先。深度优先使用栈作为保存访问过程的数据结构,同时,深度优先需要使用栈保存当前路径,并在无法继续前进时回溯,广度优先则使用队列作为保存访问过程的数据结构,其中访问顺序应保持先被访问的顶点其邻接点也优先被访问,直到图中的所有顶点都被访问为止。。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值