当前位置: 网站首页>小程序开发>网站开发

承德企业微信公众号小程序开发公司、承德企业网页设计方案、承德做网站开发价格、承德微信公众号制作运营报价明细表、承德网站设计公司费用、承德网站推广大概需要多少钱

发表日期: 2021-04-13 11:17:48 浏览次数:99

承德企业微信公众号小程序开发公司、承德企业网页设计方案、承德做网站开发价格、承德微信公众号制作运营报价明细表、承德网站设计公司费用、承德网站推广大概需要多少钱


承德,河北省地级市,河北省政府批复确定的河北国际旅游城市、连接京津辽蒙的区域性中心城市 [1]  。截至2019年,全市下辖3个区、4个县、代管1个县级市和3个自治县,总面积39519平方公里,常住人口347.32万人,城镇人口180.85万人,城镇化率52.07%。 [2] 

承德地处中国东北地区、河北省东北部,南邻京津,北接赤峰和锡林郭勒,东西与朝阳、秦皇岛、唐山、张家口相邻,距省会石家庄435公里,距北京225公里。 [3]  是连接京津冀辽蒙的重要节点,具有“一市连五省”的独特区位优势,是国家甲类开放城市,中国普通话标准音采集地、中国摄影之乡、中国剪纸之乡。 [4] 

承德是首批国家历史文化名城,1703年清康熙修建避暑山庄,成为清王朝的第二个政治中心;1723年设热河厅;1733年雍正取“承受先祖德泽”之义;赐字“皇承天德”释义先皇秉承天地化育万物的恩德; [5]  设承德直隶州,始称“承德”;民国和解放初期为原热河省省会;1955年,热河省建制撤销,承德划归河北省,为省辖市。承德的避暑山庄及其周围寺庙是中国十大风景名胜、旅游胜地四十佳、国家重点风景名胜区,被联合国教科文组织批准为世界文化遗产,也是国家首批世界文化遗产。 [4] 

2012年,承德被评为中国“十大特色休闲城市”。2016年11月,承德市被中华人民共和国国家旅游局评为第二批国家全域旅游示范区。2017年10月,承德市入选国家森林城市。 [6]  2017年12月,获得“厕所革命优秀城市奖”。


5.6.4 习题

1. 编写函数,使其能打印出二叉树节点(标号)的中序排列。假设这些节点是用如本节所描述那样具有左子节点和右子节点指针的记录表示的。

2. 编写函数,使其接受二叉表达式树,并打印出它所表示的表达式带有全部括号的版本。假设这里使用了与习题1相同的数据结构。

3. * 重复习题2,但只打印所需的括号,假设这里使用的是常用的算术运算符优先级和结合性。

4. 编写函数,使其能得出二叉树的高度。

5. 如果二叉树的节点同时具有左子节点和右子节点,那么就说该节点是完全的。用结构归纳法证明:二叉树中完全节点的数量,要比叶子节点的数量少1。

6. 假设用左子节点右子节点记录类型表示二叉树。用结构归纳法证明:NULL指针的数量要比节点的数量大1。

7. ** 树可以用来表示递归调用。每个节点都表示某个函数F的一次递归调用,而其子节点则表示F执行的调用。在本题中,要考虑对4.5节给出的\begin{pmatrix}n\\m\end{pmatrix}进行递归,根据的递归关系是\begin{pmatrix}n\\m\end{pmatrix}=\begin{pmatrix}n-1\\m\end{pmatrix}+\begin{pmatrix}n-1\\m-1\end{pmatrix}。每次调用都可以用一棵二叉树表示。如果某个节点对应着\begin{pmatrix}n\\m\end{pmatrix}的计算,而且不属于依据情况(m=0和m=n),那么其左子节点就表示\begin{pmatrix}n-1\\m\end{pmatrix},而右子节点表示\begin{pmatrix}n-1\\m-1\end{pmatrix}。如果该节点表示的是依据情况,那么它就既没有左子节点,也没有右子节点。

(a) 通过结构归纳法证明:根节点对应着\begin{pmatrix}n\\m\end{pmatrix}的二叉树刚好有2\begin{pmatrix}n\\m\end{pmatrix}-1个节点。

(b) 利用(a)证明:\begin{pmatrix}n\\m\end{pmatrix}对应递归算法的运行事件是O\biggl(\begin{pmatrix}n\\m\end{pmatrix}\biggr)。请注意,该运行时间因此也就是O(2n),不过后者是平滑但非紧边界。

中序遍历

除了二叉树的前序排列和后序排列外,二叉树就只有一种有意义的节点排列方式了。在二叉树中,探索完左子树之后,而在探索右子树之前(即图5-30中操作T1的位置)列出每个节点,这样就形成了二叉树节点的中序排列。例如,在图5-31所示的树中,中序排列就是a+b-c *d

对表示表达式的二叉树进行前序遍历,得到的就是该表达式的前缀形式,对同样的树进行后序遍历,则会得到表达式的后缀形式。而中序遍历则几乎会产生原始的,或者说是中缀形式的表达式,不过该表达式是没有括号的。也就是说,图5-31中的树表示的表达式a+(b-c ) *d 与其中序排列a+b-c *d 是不同的,差别只是后者中少了必要的括号而已。

要确保所需的括号出现,可以为所有的运算符加上括号。在这种修改后的中序遍历中,在探索左子树之前执行的操作A0,会检查节点的标号是否为运算符,而且,如果是运算符的话,就会打印“(”,也就是左括号。同样地,如果标号是运算符,探索完两棵子树后执行的操作A2就会打印右括号“)”。将该规则应用于图5-31所示的二叉树,得到的结果会是(a+((b-c)*d)),这就有了b-c 两侧一对必要的括号,以及两对多余的括号。

 

对二叉树进行结构归纳

与普通树一样,结构归纳法也适用于二叉树。其实还可以使用更简单的模式,这种模式下的依据是空树。下面就是对这一技巧的总结。

1. 指定要证明的命题S(T ),其中T 是一棵二叉树。

2. 证明依据,即证明若T 是空树,则S(T )为真。

3. 设T 是以r 为根节点,并以TL 和TR 为子树的二叉树,以此构建归纳步骤。声明假定有归纳假设,即S(TL)和S(TR)为真。

4. 在(3)中提到的假设下证明S(T )为真。

5.7 二叉查找树

各种计算机程序中有一种同样的活动,就是维护这样一组值,用户希望:

1. 向这组值中插入元素;

2. 从这组值中删除元素;

3. 查找某元素,看看它是否在这组值中。例子之一是英语词典,我们时不时地会往里面插入一些新单词,比如fax;删除一些不再使用的单词,比如aegilops;或者是要查找一串字母,看看其是否为单词,例如,这是拼写检查器程序的一部分。

因为这个例子是我们非常熟悉的,所以不管其具体用途是什么,只要是可以按照上述定义对其执行插入删除查找操作的一组值,都叫作词典。再举个词典的例子,某教授可能要记录选修某课程学生的花名册。偶尔会有学生被加入这门课程(插入),或是退出该课程(删除),或是需要弄清某个学生是否选修了该课程(查找)。

二叉查找树这种带标号的二叉树是实现词典的一个好方法。假设节点的标号是按照“小于”顺序(我们会将其写作<)从一组值中选出的。例子包括具有一般小于顺序的实数或整数,或是有着用<表示的词典顺序或字母表顺序的字符串。

二叉查找树(Binary Search Tree,BST)是一种带标号的的二叉树,以下属性对这种二叉树的每个节点x 都成立:x 的左子树中所有节点的标号都小于x 的标号,而其右子树中所有节点的标号都大于x 的标号。这种属性被称为二叉查找树属性

示例 5.22

图5-33展示了对应着集合{HairyBashfulGrumpySleepySleazyHappy}的二叉查找树,其中<顺序是词典顺序。请注意,根节点左子树在词典顺序上都小于Hairy,而右子树在字典顺序上都大于它。这一属性对该树中的每个节点都成立。

图 5-33 具有6个带字符串标号的节点的二叉查找树

5.7.1 用二叉查找树实现词典

我们可以将二叉查找树表示为任何带标号的二叉树。例如,可以按如下形式定义NODE类型。

typedef struct NODE *TREE;struct NODE {
    ETYPE element;
    TREE leftChild, rightChild;};复制代码

二叉查找树被表示为指向二叉查找树根节点的指针。元素的类型ETYPE应该得到合理的设置。在本章所有的程序中,都将假设ETYPEint类型,从而使元素间的比较可以直接用算术比较运算符<==>完成。在涉及词典顺序比较的例子中,可以假设程序中的比较由诸如2.2节中讨论过的lteq 和gt 这样的比较函数完成。

5.7.2 二叉查找树中元素的查找

假设想在由二叉查找树T 表示的某词典中查找某个元素x。如果将x 与T 的根节点处的元素加以比较,就可以利用二叉查找树属性快速找到x,或确定x 没有出现。如果x 在根节点处,就完成了查找。否则,如果x 比根节点处的元素小,x 就只可能在左子树中被找到(根据二叉查找树属性),而如果x 比根节点处的元素大,x 就只可能出现在右子树中(还是因为二叉查找树属性)。也就是说,可以通过以下递归算法表示查找操作。

依据。如果树T 是空树,那么x 未出现。如果树T 非空,而且x 在根节点,那么x 就出现了。

归纳。如果T 非空而x 未在根节点位置,设y 是T 根节点处的元素。如果xy,则只在根节点的左子树中查找x;如果x>y,则只在y 的右子树中查找x。二叉查找树属性保证x 不可能出现在没有查找的那棵子树中。

抽象数据类型

诸如插入、删除和查找这种可能对一组对象或特定类别执行的一系列操作,有时称为抽象数据类型或ADT。这一概念也会被称为类或模块。我们将在第7章中研究若干抽象数据类型,而在本章中,我们会看到其中一个:优先级队列。

ADT可以有多种抽象实现。例如,在本节中可看到二叉查找树是一种实现词典ADT的好方法。表是另一种看似可靠实则经常效率低下的实现词典ADT的方式。7.6节将介绍散列,另一种不错的词典实现方式。

每种抽象实现依次可通过若干种不同的数据类型来具体实现。举例来说,可以使用二叉树的左子节点右子节点实现作为实现二叉查找树的数据结构。这一数据结构,加上用于插入、删除和查找的恰当函数,就成了词典ADT的一种实现。

在程序中使用ADT的一个重要原因是,ADT底层的数据只能通过ADT的操作(比如插入)来访问。这一限制是防御性编程的一种形式,可以防止操作数据的函数以意料之外的方式对数据进行偶发变更。使用ADT的第二个重要原因在于,ADT让我们可以重新设计数据结构和实现其操作的函数,在不担心会为程序其余部分引入错误的前提下,这样可能提高操作的效率。如果只有用于ADT操作的接口函数被正确地重写,就不会出现新的错误。

示例 5.23

假设想要在图5-33的二叉查找树中查找Grumpy。将Grumpy与根节点处的Hairy相比较,发现Grumpy在词典顺序上要先于Hairy,因此要对左子树调用lookup

左子树的根节点是Bashful,而将该标号与Grumpy相比,发现前者要先于后者。因此要对Bashful的右子树递归地调用lookup。现在发现Grumpy在这一子树的根节点处,并返回TRUE。这些步骤是由具有图5-34模式的词典顺序比较函数执行的。

     BOOLEAN lookup(ETYPE x, TREE T)
     {(1)      if (T == NULL)(2)          return FALSE;(3)      else if (x == T->element)(4)          return TRUE;(5)      else if (x < T->element)(6)          return lookup(x, T->leftChild);
         else /* x 一定是大于T->element */(7)          return lookup(x, T->rightChild);
     }复制代码

图 5-34 如果x 在T 中,函数lookup(x,T)会返回TRUE,否则返回FALSE

更具体地讲,图5-34中的递归函数lookup(x,T)使用左子节点右子节点数据结构实现了这一算法。请注意,lookup返回的是BOOLEAN类型的值,这一类型实际上与int相同,不过它定义的值只有TRUEFALSE,分别定义为1和0。BOOLEAN类型是在1.6节中引入的。此外,请注意,这里的lookup函数只接受能由=<等运算符比较的类型。如果要让它处理示例5.23中用到的字符串那样的数据,就需要重写。

在第(1)行,lookup会确定T 是否为空。如果不为空,那么lookup在第(3)行会确定x 是否存储在当前节点。如果x 不在该节点,那么lookup就会根据x 是小于还是大于当前节点存储的元素,递归地查找左子树或右子树。

5.7.3 二叉查找树元素的插入

向二叉查找树T 中增加一个新元素x 是很简单的,以下递归算法简要描述了处理思路。

依据。如果T 是空树,用一棵由单个节点构成的树替代T,并在该节点处放上x。如果T 非空而且其根节点处有元素x,那么x 已经在字典中,不需要再做任何事情。

归纳。如果T 非空,而且x 不在其根节点处,那么如果x 小于根节点处的元素,就将x插入左子树,如果x 大于根节点处的元素,就将x 插入右子树。

如图5-35所示的insert(x,T)函数为左子节点右子节点数据结构实现了这一算法。在第(1)行发现T的值为NULL时,就会新建一个节点,该节点就成了树T。第(2)到第(5)行会创建该树,并在第(10)行返回。

      TREE insert(ETYPE x, TREE T)
      {
 (1)      if (T == NULL) {
 (2)          T = (TREE) malloc(sizeof(struct NODE));
 (3)          T->element = x;
 (4)          T->leftChild = NULL;
 (5)          T->rightChild = NULL;
          }
 (6)      else if (x < T->element)
 (7)          T->leftChild = insert(x, T->leftChild);
 (8)      else if (x > T->element)
 (9)          T->rightChild = insert(x, T->rightChild);(10)      return T;
      }复制代码

图 5-35 insert(x,T)函数将x 添加到T 中

如果在T 的根节点处没找到x,那么在第(6)到第(9)行,会根据相应的情况对左子树或右子树调用insert函数。被该插入操作修改过的子树,会分别在第(7)或第(9)行成为T 的根节点的左子树或右子树的新值。第(10)行会返回增加过元素的树。

请注意,如果x 在T 的根节点,那么第(1)、第(6)和第(8)行的测试都不会成功。这种情况下,insert会在什么都不做的情况下返回T,这是正确的,因为x 已经在树中了。

示例 5.24

承德企业微信公众号小程序开发公司承德企业网页设计方案承德做网站开发价格、承德微信公众号制作运营报价明细表、承德网站设计公司费用、承德网站推广大概需要多少钱

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: https://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878