标签:输出 order 2.3 i+1 deb not 表达 data otto
树的结构是一种非线性结构,一对多,定义也是递归的,有一个根结点和任意个子树。
我的学习体会:我觉得树相比之前的一对一的线性结构来说,难度增大了很多,树的实现又会借用到之前学的栈啊,队列啊,就像是之前所学的大杂烩,并且会用上递归,虽然递归可读性很好,但是想出怎么写也是很难,看懂容易,自己写递归不容易。
树可以应用在查找,如二叉搜索树,用在求类似最优路径的问题,如哈夫曼树,应用在做计算表达式,把表达式转化成树,再求值,能算复杂运算。等等......
2.2 设计思路(伪代码或流程图)
void InitExpTree(BTree &T,string str)
{
初始化两个栈s1,s2,分别存操作数和运算符;
int i=0;BTree s;
while (i<str.size())
do
if(str[i]是操作数)
then
新建节点s,存入操作数,并置左右孩子为空;
s进栈s1;
else
then
if(s2为空)
then
新建节点s,存入运算符,并置左右孩子为空;
进栈s2;
else
if(str[i]的优先级大于s2.top())
then
新建节点s,存入运算符,并置左右孩子为空;
进栈s2;
else
then
if(str[i]是‘)‘)
then
while (s2.top()!=‘(‘)
s2.top()->rchild=s1.top();
s1.pop()
s2.top()->lchild=s1.top();
s1.pop()
s2.pop()
end while
else
then
while(s2.top()!=‘(‘并且s2.top()优先级小于str[i])
重复上面遇到‘(‘的操作,为s2配左右孩子
end while
end while
}
double EvaluateExTree(BTree T)
{
if(T->data为数字字符)
return T->data-‘0‘;
if(T为空)return 0;
else
{
switch(T->data)
{
case ‘+‘:return 左子树的值+右子树的值;break;
case ‘-‘:return 左子树的值-右子树的值;break;
case ‘*‘:return 左子树的值*右子树的值;break;
case ‘/‘:if(右子树空不为0)
return 左子树的值/右子树的值;break;
else 打印除零错误语句
}
除0错误
百度之后发现这个nan是not a number 分母为零会产生这次错误
有括号表达式
解决方法
增加while语句
while( s2.size()&&s1.size()&& Precede(s2.top()->data,str[i])==‘>‘&&s2.top()->data!=‘(‘)
2.2 设计思路(伪代码或流程图)
采用哈夫曼树的思想,每次找出最小的两个
queue<int>q;
cin>>n;
int min1,min2;
for i=0 to n-1
cin>>p,p全部进队q
while (q.size()-1)
do
min1=q.front();q.pop()
min2=q.front();q.pop()
for i=0 to n-1
if(队首元素<min1)
then
q.push(min2)
min2的值等于min1
min1的值为队首元素
q.pop();
elseif(队首元素<min2)
then
q.push(min2)
min2=队首元素
q.pop()
else
q.push(队首);
q.pop();
endfor
sum=min1+min2
q.push(sum)
end while
在codeblock测试过提交,一次就过了
int sum 全局变量
btree create(string str ,int i )//顺序转化为二叉链
{
btree t;
t=new tnode;
if(i为负数||i>=str[i]) return NULL//注意>=
t->data=str[i];
t->rchild=(str,2*i+1)//下标关系
t->lchild=(str,2*i)
return t;
}
void level(btree t,int h)
{
if(t为空)
sum+=0;
if(t为叶子节点)
sum+=t->data*h;
else
{
level(t->lchild,h+1)//注意注意,h+1,不是h++!!
level(t->rchild,h+1)
}
}
咨询同学得到两个测试数据 #1,#1234#56#7###9,这类情况出现问题
看了好几遍发现:( ,在create 函数中对不规范i的判定有问题,因为题目给的输出中第一个一定是#。所以当i>str.size()时,就出错了
解决方法
if(i<=0||i>str.size()) return NULL
改为
if(i<=0||i>=str.size()) return NULL
必做题做完。
代码截图:
代码说明:分别采用递归和非递归的方式来求树的宽度
代码地址 https://www.cnblogs.com/xiaodeyao/p/5064816.html
标签:输出 order 2.3 i+1 deb not 表达 data otto
原文地址:https://www.cnblogs.com/huangqingqing/p/8994534.html