Hdu1805-Expression(表达式树模版题+层序遍历树+栈的基本应用)
2018-11-23-02:27:37
原题链接
题目描述:
题目一目了然。
本题思路:
本题很容易能想到是构建表达式树然后按照层序逆序输出即可。
AC代码:
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <iostream>
using namespace std; typedef char TElemType;
typedef struct BiNode {
TElemType Elem;
struct BiNode *Left_Child;
struct BiNode *Right_Child;
} BiNode, *BiTree;
bool IsOperator(char Elem);
void PrintBiTree(BiTree T);
BiTree ConstructingExpressionTree(string Expression); int main() {
BiTree T;
string Expression;
cin >> Expression;
T=ConstructingExpressionTree(Expression);
PrintBiTree(T);
return ;
}
bool IsOperator(char Elem) {
return (Elem == '+' || Elem == '-' || Elem == '*' || Elem == '/');
} BiTree ConstructingExpressionTree(string Expression) {
stack<BiTree>Operand;
for(int i = ; i < Expression.length(); i++) {
BiTree Child;
if(!IsOperator(Expression[i])) {
Child = new BiNode;
Child->Elem = Expression[i];
Child->Right_Child = NULL;//Operand一定是叶结点
Child->Left_Child = NULL;
Operand.push(Child);
}
if(IsOperator(Expression[i])) {
Child = new BiNode;
Child->Elem = Expression[i];
Child->Right_Child = Operand.top();
Operand.pop();
Child->Left_Child = Operand.top();
Operand.pop();
Operand.push(Child);//将构造好的子表达式树的结点压入栈,便于最后汇入总表达式树
}
}
return Operand.top();
} void PrintBiTree(BiTree T){
//按照层序遍历输出二叉树
if(T==NULL) return;
queue<BiTree>QueueTreeNode;
QueueTreeNode.push(T);//首先将二叉树的头结点放入队列
while(!QueueTreeNode.empty()){//如果队列为空则结束遍历
BiTree QueueNode=QueueTreeNode.front();//每次访问队列的第一个元素并将其弹出
QueueTreeNode.pop();
cout<<QueueNode->Elem<<' ';
if(QueueNode->Left_Child)//将第一个元素的左右子树的结点都放入队列
QueueTreeNode.push(QueueNode->Left_Child);
if(QueueNode->Right_Child)
QueueTreeNode.push(QueueNode->Right_Child);
}
}
本题应熟记知识点:表达式树的构建与层序遍历二叉树。
1.构建表达式树
① 算法描述:
遍历后缀表达式,如果符号是Operand,那么我们就建立一个单结点树并将一个指向他的指针推入栈中,如果符号是Operator,那么我们就从栈中弹出指向两棵树T1和T2的那两个指针(T1的先弹出)并形成一颗新
的树,该树的根就是Operator,他的左右儿子分别指向T2和T1,然后将指向这颗新树的指针压入栈中。
② 代码:
BiTree ConstructingExpressionTree(string Expression) {
stack<BiTree>Operand;
for(int i = ; i < Expression.length(); i++) {
BiTree Child;
if(!IsOperator(Expression[i])) {
Child = new BiNode;
Child->Elem = Expression[i];
Child->Right_Child = NULL;//Operand一定是叶结点
Child->Left_Child = NULL;
Operand.push(Child);
}
if(IsOperator(Expression[i])) {
Child = new BiNode;
Child->Elem = Expression[i];
Child->Right_Child = Operand.top();
Operand.pop();
Child->Left_Child = Operand.top();
Operand.pop();
Operand.push(Child);//将构造好的子表达式树的结点压入栈,便于最后汇入总表达式树
}
}
return Operand.top();
} bool IsOperator(char Elem) {
return (Elem == '+' || Elem == '-' || Elem == '*' || Elem == '/');
}
2.二叉树的层序遍历
① 算法思路:
代码里都有。
② 代码:
void PrintBiTree(BiTree T) {
//按照层序遍历输出二叉树
if(T == NULL) return;
queue<BiTree>QueueTreeNode;
QueueTreeNode.push(T);//首先将二叉树的头结点放入队列
while(!QueueTreeNode.empty()) { //如果队列为空则结束遍历
BiTree QueueNode = QueueTreeNode.front(); //每次访问队列的第一个元素并将其弹出
QueueTreeNode.pop();
cout << QueueNode->Elem << ' ';
if(QueueNode->Left_Child)//将第一个元素的左右子树的结点都放入队列
QueueTreeNode.push(QueueNode->Left_Child);
if(QueueNode->Right_Child)
QueueTreeNode.push(QueueNode->Right_Child);
}
}
Hdu1805-Expression(表达式树模版题+层序遍历树+栈的基本应用)的更多相关文章
- hdu 4825 Xor Sum(01字典树模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题解:一到01字典树的模版题,01字典树就是就是将一些树用二进制放到一个树上这样可以方便对整体异 ...
- [poj2104]可持久化线段树入门题(主席树)
解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序 ...
- DHU--1247 Hat’s Words && HiHocder--1014 Trie树 (字典树模版题)
题目链接 DHU--1247 Hat’s Words HiHocder--1014 Trie树 两个一个递归方式一个非递归 HiHocoder #include<bits/stdc++.h> ...
- HDU 1166 敌兵布阵 (线段树模版题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ--2104 K-th Number (主席树模版题)
题目链接 求区间第k大 #include<iostream> #include<cstring> #include<algorithm> #include<v ...
- HDU--4417 Super Mario (主席树模版题)
题目链接 题目让求 L R区间 不大于H 的数有多少 数据太大需要离散化 #include<bits/stdc++.h> using namespace std; #define maxn ...
- BZOJ 2759 一个动态树好题(动态树)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 思路 每个节点仅有一条有向出边, 这便是一棵基环内向树,我们可以把它在 \(\text ...
- 使用jackson解析json串得到树模型,然后遍历树模型获得需要的数据
Problem:从网址 http://quotes.money.163.com/hs/service/marketradar_ajax.php?host=http%3A%2F%2Fquotes.mon ...
- 树的总结(遍历,BST,AVL原型,堆,练习题)
目录 树 一.抽象数据类型 二.二叉树的性质 三.二叉树的遍历 三.活用树的遍历 四.BST树 五.AVL树 六.BST树和AVL树练习 七.堆 树 @ 一.抽象数据类型 1.顺序存储 使用数组存储 ...
随机推荐
- MonGoDB 常见操作, 设置管理员和用户登入
[ 启动客户端 => ./bin/mongo --host 192.168.200.100 ] 1: 查看所有已经创建的数据库 => show dbs 2: 切换或者创建数据库 ...
- element——message-box
`${action}`可以捕获用户选择cancel还是confirm,然后进行相应操作 官方文档:http://element-cn.eleme.io/#/zh-CN/component/messag ...
- 原生java读取存储为xml格式的数据,并存储到java bean里
一.举例读取的文件为:X-bond可交易债券信息_20180917.xml <?xml version="1.0" encoding="UTF-8"?&g ...
- DOM节点的增删改查以及class属性的操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android 深入浅出 - 进程生命周期(Process Lifecycle)
Android 5 个进程等级 1. Foreground Process : 2 .Visible Process : 3. Service Process : 4. Background Proc ...
- 简单全局HOOK拦截大部分键盘消息
前言:学习HOOK中,万一老师讲解HOOK入门教程:http://www.cnblogs.com/del/category/124150.html http://www.cnblogs.com/del ...
- Structs复习 Action
引入jar包 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...
- MVC缺点总结
MVC的缺点: 1.完全理解MVC比较复杂. 由于MVC模式提出的时间不长,加上同学们的实践经验不足,所以完全理解并掌握MVC不是一个很容易的过程. 2.调试困难. 因为模型和视图要严格的分离,这样也 ...
- win8安装iis asp.net
http://www.sanrengo.net/thread-62-1-1.html本文主要解决的是在win8操作系统下IIS配置asp.net的运行环境,当然win7的配置方法也大致相似,只有少许部 ...
- JAVA回文
package huiwen; import java.util.Scanner; public class Huiwen { public static void main(String[] arg ...