
发表日期: 2021-04-14 15:10:20 浏览次数:110
馆陶网站优化【馆陶开通400电话】馆陶网站搭建、馆陶微信公众号推文外包、馆陶开通京东拼多多设计、馆陶淘宝装修
馆陶县,河北省邯郸市下辖县 [1] ,地处河北省东南部,以卫运河为界与山东省冠县、临清市毗邻。全县辖4镇4乡277个行政村,总面积456平方公里,其中耕地面积48万亩,总人口36万人。馆陶是千年古县,赵王“在城(今冠县东古城)西北七里陶丘侧置馆,故名馆陶”,自西汉初置县,已有2200多年历史。
馆陶县先后荣获中国蛋鸡之乡、中国黑陶艺术之乡 、中国粮画之乡、中国轻工轴承之乡、中国黄瓜之乡、中国漆画艺术之乡、全国休闲农业和乡村旅游示范县、全国电子商务进农村示范县、全国义务教育发展基本均衡县、全国中医工作先进县、全国群众体育工作先进县等等30余项国家级殊荣。
近年来,馆陶县着力打造了五张名片。一是“最大”,禽蛋交易市场金凤市场,单体全国最大,鸡蛋远销广东、广西等地,2016年交易额达到110亿元;二是“最优”,馆陶是中国著名的黑陶艺术之乡,现代黑陶艺术经过馆陶人的继承和创新,达1000多个品种;三是“最好”,馆陶是中国唯一的黄瓜之乡,馆青牌黄瓜,连续四年荣获中国绿色博览会金奖;四是“最佳”,馆陶有独一无二的富含三价有机铬的黑小麦,可应用于抑制血糖和抗肿瘤等医学领域;五是“最美”,粮画小镇被评为“中国十大最美乡村”,即将由3A级景区升级成为国家4A级旅游景区。 [2-6]
2020年4月,被河北省体育局评选为“2019年度体育工作最佳县(市、区)”。
另一种为树中节点排序的常见方式是后序,对应图5-14所示树的环游,不过会列出最后访问的节点,而不是第一次访问的节点。例如,在图5-14中,后序排列就是abc-d*+。
要生成节点的后序排列,需要由最后的操作来完成打印,这样才会在对节点的所有子节点从左起依次调用后序排列函数之后,再打印该节点的标号。其他的操作则会初始化穿越子节点或移动到下一子节点的循环。请注意,如果某个节点是叶子节点,那么要做的只有列出标号,而不存在任何递归调用。
如果使用示例5.13介绍的节点表示方式,就可以通过图5-17中的递归函数postorder构建后序排列。在对图5-14所示树的根节点调用该函数时的操作如图5-18所示,这里使用了与图5-16中一致的节点名称转换方式。
void postorder(pNODE n)
{
pNODE c; /* 节点 n 的子节点 */(1) c = n->leftmostChild;(2) while (c != NULL) {(3) postorder(c);(4) c = c->rightSibling;
}(5) printf("%c\n", n->nodeLabel);
}复制代码图 5-17 递归的后序函数
调用 postorder(+)(+) 调用 postorder(a)(a) 打印 a(+) 调用 postorder(*)(*) 调用 postorder(-)(-) 调用 postorder(b)(b) 打印 b(-) 调用 postorder(c)(c) 打印 c(-) 打印 -(*) 调用 postorder(d)(d) 打印 d(*) 打印 *(+) 打印 +复制代码
图 5-18 递归函数postorder对图5-14所示树进行的操作
接下来的例子要求我们在对子树进行的所有递归调用中执行一些重大操作。假设给定一棵表达式树,其中以整数为操作数,并使用二元运算符,而且希望得出该树表示的表达式的数值。我们可以通过对该表达式树执行以下递归算法达成这一目的。
依据。对于一个叶子节点,得出该节点的值作为树的值。
归纳。假设要计算以某个节点n 为根节点的子树形成的表达式的值。我们要为以n 的子节点为根节点的子树所对应的子表达式求值,这两个值是节点n 处的运算符对应的操作数的值。接着就可以对这两个子树的值应用标号为n 的运算符,这样就得到了以n 为根节点的整棵子树的值。
前缀表达式和后缀表达式
如果以前序列出表达式树的标号,就得到了给定表达式的前缀表达式。同样,以后序列出表达式树的标号就得出等价的后缀表达式。而普通概念的表达式,就是二元运算符出现在操作数之间的表达式,称为中缀表达式。例如,图5-14中表达式树的中缀表达式为a+(b-c)*d。正如我们在示例5.13和示例5.14中所见,等价的前缀表达式是+a*-bcd,等价的后缀表达式是abc-d*+。
有个有关前缀和后缀概念的有趣事实,只要每个运算符都有唯一的参数数量(比如,不能同时使用一元和二元的减号),那么就算没有括号,也还是能清楚地将运算符与它们对应的操作数进行分组。
可以按照如下方式由前缀表达式构建中缀表达式。在前缀表达式中,可以看到运算符后跟着所需数量的操作数,而没有内嵌的运算符。例如,在前缀表达式+a*-bcd 中,子表达式-bc 就是这样一个字符串,因为这个减号像此例中的所有运算符一样是二元的。我们可以用新符号来代替该子表达式,比如说设x=-bc,接着再重复这一确定运算符后跟其对应操作数的过程。在本例中,就是要对+a*xb进行处理。在这里可以确定子表达式y=*xd,并将剩余的字符串缩减为+ay。现在剩下的字符串就只有一个运算符和它的操作数了,这样就可以转换为中缀表达式a+y。
现在就可以通过重现这些步骤来重建中缀表达式中剩下的部分了。可以看到子表达式y=*xd 的中缀形式为x*d,所以可以将a+y 中的y 替换为x*d,这样就得到了a+(x*d)。请注意,一般来说,中缀表达式里是需要括号的,虽然在本例中在为操作数分组时因为*的优先级比+高所以省略了这对括号。接着将x=-bc 替换为中缀表达式b-c,便可得到最终的表达式为a+((b-c)*d),这与图5-14中的树表示的表达式是相同的。
对后缀表达式来说,可以利用相似的算法。唯一的区别就是在分解后缀表达式时是要看运算符以及放在它们前面的必要数量的操作数。
我们将指向节点的指针与节点定义如下。
typedef struct NODE *pNODE;struct NODE {
char op;
int value;
pNODE leftmostChild, rightSibling;};复制代码字段op存放的要么是表示算术运算符的字符,要么是字符i,这里的i代表integer(整数),并确认节点为叶子节点。如果该节点是叶子节点,那么value字段就存放着该节点表示的整数,在处理内部节点时是用不上value的。
这一概念允许运算符具有任意数量的参数,虽然我们在编写代码时会出于简便性的考虑而假设所有运算符都是二元的。代码如图5-19所示。
int eval(pNODE n)
{
int val1, val2; /* 第一棵子树和第二棵子树的值 */(1) if (n->op) == ’i’) /* n points to a leaf */(2) return n->value;
else {/* n 指向内部节点 */(3) val1 = eval(n->leftmostChild);(4) val2 = eval(n->leftmostChild->rightSibling);(5) switch (n->op) {(6) case '+': return val1 + val2;(7) case '-': return val1 - val2;(8) case '*': return val1 * val2;(9) case '/': return val1 / val2;
}
}
}复制代码图 5-19 为算术表达式求值
如果节点n是叶子节点,第(1)行的测试会成功,并在第(2)行返回该叶子节点的整数标号。如果该节点不是叶子节点,那么会在第(3)行给它的左操作数求值,并在第(4)行给它的右操作数求值,分别将结果存入val1和val2。联系第(4)行的表示,可以注意到节点n的第二个子节点就是节点n最左子节点的右兄弟节点。第(5)行到第(9)行形成了一个switch语句,在该语句中要决定n处为何种运算符,并为左操作数和右操作数的值应用合适的运算。

图 5-20 操作数为整数的表达式树
例如,考虑图5-20中所示的表达式树。在图5-21中我们还会看到在为该表达式求值时,每个节点处进行的调用和返回的序列。和以往一样,要利用到节点标号是唯一的这一事实,并用它们的标号来为其命名。
调用 eval(+) (+) 调用 eval(5) (5) 返回 5 (+) 调用 eval(*) (*) 调用 eval(-) (-) 调用 eval(10)(10) 返回 10 (-) 调用 eval(3) (3) 返回 3 (-) 返回 7 (*) 调用 eval(2) (2) 返回 2 (*) 返回 14 (+) 返回 19复制代码
图 5-21 函数eval在图5-20所示树的每个节点处进行的操作
有时需要确定树中各节点的高度,节点的高度可由以下函数递归地定义。
依据。叶子节点的高度为0。
归纳。内部节点的高度要比其子节点最大的高度大1。
可以将这一定义转换成递归程序,该程序会将每个节点的高度计算出来存放到height字段中。
依据。在叶子节点处,将高度置为0。
归纳。在内部节点,递归地计算子节点的高度,找出最大值,加上1,并将结果存储到height字段中。
该程序如图5-22所示,假设节点是具有如下形式的结构体。
typedef struct NODE *pNODE;struct NODE {
int height;
pNODE leftmostChild, rightSibling;};复制代码computeHt函数接受指向节点的指针作为参数,并计算出该节点的高度存放到height字段中。如果在树的根节点处调用该函数,就会计算该树中所有节点的高度。

服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878