二叉树:后缀式转换成表达式二叉树(从后缀式的计算入手和遍历的递归实现入手) |
您所在的位置:网站首页 › 表达式怎么转表达式树 › 二叉树:后缀式转换成表达式二叉树(从后缀式的计算入手和遍历的递归实现入手) |
文章目录
问题描述 :输入说明 :输出说明 :输入范例 :输出范例 :思路分析实现伪码事故现场第一次提交最后一次提交
分析与总结如果不妥,请留言,你的留言是对我最大的鼓励。当然加扣扣问也行,一定知无不言,言无不尽,一块商量进步学习
问题描述 :
内容:(1)请参照链表的ADT模板,设计二叉树并逐步完善的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。) 注意:二叉树ADT的基本操作的算法设计很多要用到递归的程序设计方法。 (2)ADT的简单应用:使用该ADT设计并实现若干应用二叉树的算法设计。 应用:要求设计一个算法,将后缀表达式转换成表达式二叉树。二叉树的存储结构的建立参见二叉树应用1。 注意:假定输入的后缀表达式为合法的表达式。仅考虑有小括弧的场合。运算符包括+、-、*、/,运算数为整数(不局限于个位数)。 提示:使用1个栈:保存指向二叉树树根的指针栈Stack。算法函数返回指向表达式二叉树root的指针。 参考函数原型: //后缀表达式生成表达式二叉树 template BinaryTreeNode * Suffix_BinaryTree(SqStack &Stack, string &suffix);辅助函数: (1)判断是否为运算符(用户函数) //判断是否为运算符 bool isoperator( char op ){ switch(op){ case '+': case '-': case '*': case '/': case '(': case ')': return true; default: return false; } }(2)求运算符的优先级(用户函数) //求运算符的优先级 int getOperPri(char op) { switch(op) { case '(': return 1; break; case '+': case '-': return 2; break; case '*': case '/': return 3; break; default: return 0; } } 输入说明 :第一行:后缀表达式字符串 输出说明 :第一行:表达式二叉树前序遍历结果(前缀式) 第二行:表达式二叉树中序遍历结果(中缀式,带加括号处理) 第三行:表达式二叉树后序遍历结果(后缀式) 输入范例 : 12 14 + 3 * 400 30 10 5 * + / - 62 + 输出范例 : + - * + 12 14 3 / 400 + 30 * 10 5 62 (12+14)*3-400/(30+10*5)+62 12 14 + 3 * 400 30 10 5 * + / - 62 + 思路分析先从后缀式的运算说起,模仿运算,生成的二叉树,然后根据二叉树生成中缀式 附加后缀式运算的传送门的传送门 修改如下 处理中序遍历中的括号 专门修改针对符号的优先级,修改中序遍历的,很容易就看见所有的叶子结点都是数字,度数为2的点都是符号,并且没有括号的化,父节点的优先级大于或者等于子节点的优先级。如果不是就输出括号。 修改中序遍历实现。 遍历的函数:只给出了子函数的递归部分,非递归部分 bool InOrderRur(BinaryTreeNode *root,bool (*visit)(BinaryTreeNode *temp)){ if(root) { char temp=' ',left= ' ',right=' '; if(root->GetLChild() &&root->GetRChild()){ temp = root->getData().at(0); left = root->GetLChild()->getData().at(0); right = root->GetRChild()->getData().at(0); if(isoperator(left) && getOperPri(left) InOrderRur(root->GetLChild(),visit2); } visit2(root); if(isoperator(right) && getOperPri(right) InOrderRur(root->GetRChild(),visit2); } return true; } return false; } 事故现场 第一次提交![]() |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |