标签:遍历 节点 tree 所有结点 inf 输出 类型 info 运算
**建树**
创建一个char类型存放逻辑运算符的栈op和一个BTree类型存放数字的栈st
创建BTree类型的结bt和leaf
先将#入栈
遍历str函数
如果为数字
为叶子结点leaf申请空间,并将str的值赋予它,同时将它入到st栈中
如果为逻辑运算符
先判断op栈顶运算符和str运算符优先级大小
若op大,则将op栈和st栈出栈,并将栈op字符作为双亲、栈st的数字遵循先右再左的顺序建树
若op小,则继续入栈
若遇到括号匹配,优先出栈
将op栈剩余的运算符全部出栈
方法同上,先右再左的原则建树
最后将栈st顶的字符赋予T,作为其根节点
**计算**
创建BTree类型的栈s存放T的所有结点
创建double类型的栈result存放计算结果
后序遍历树T,遇到运算符,出栈左右孩子结点作相应的逻辑运算操作,得出的结果覆盖原本运算符的位置
遍历到树空时,返回栈result顶的值,即为表达式的值
基本没有什么大问题,就是按照上课说的方法来写代码,交的时候多交了一些函数导致编译错误
申请一个优先队列q
输入木头要切成的段数n和每段的长度m
将m压入优先队列q
每次取最小两个数出队,相加之后再入队
sum记录每次两个权值最小的数相加之和
出队到队列q为空,再输出sum即为最小花费
编译错误是因为队列q去栈顶函数top没括号导致
ps:用优先队列做的复杂度远比用树做低,而且更加简单易懂
**建树:**
建立BTree类型的栈q
建立BTree类型的树T
直接从第二个数开始判断是否为#号
若为#号,则该树为空树
否则创建新的左右孩子节点,将数组str[1]的值赋予树T根节点,并将BT入队
while(队列q不为空)
T取q队头后将其出队
如果T不为空树,构建左子树,并将左节点入到队q
当左结点构建完毕,如果T不为空树,构建右子树,并将右节点入到队q
当数组str遍历完毕后退出循环
**计算wpl:**
设置静态局部变量sum存放wpl的值
如果BT不为空树且遍历到叶子结点
sum的值为上次sum的值加上当前结点权值BT->data*结点深度weight
递归遍历所有叶子结点,重复上述步骤直到遍历完整棵树
五分的原因:建树构建右子树时函数没写完整
十五分的原因:计算wpl时,非叶子结点的条件写成了if(BT->left!=NULL||BT->right!=NULL),逻辑关系就混乱了,不知道是只有左子树为空还是右子树为空亦或是两者皆为空,导致sample 1过了,sample2没过
230
标签:遍历 节点 tree 所有结点 inf 输出 类型 info 运算
原文地址:https://www.cnblogs.com/ljy1999/p/8995052.html