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(表达式树模版题+层序遍历树+栈的基本应用)的更多相关文章

  1. hdu 4825 Xor Sum(01字典树模版题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题解:一到01字典树的模版题,01字典树就是就是将一些树用二进制放到一个树上这样可以方便对整体异 ...

  2. [poj2104]可持久化线段树入门题(主席树)

    解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序 ...

  3. DHU--1247 Hat’s Words && HiHocder--1014 Trie树 (字典树模版题)

    题目链接 DHU--1247 Hat’s Words HiHocder--1014 Trie树 两个一个递归方式一个非递归 HiHocoder #include<bits/stdc++.h> ...

  4. HDU 1166 敌兵布阵 (线段树模版题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. POJ--2104 K-th Number (主席树模版题)

    题目链接 求区间第k大 #include<iostream> #include<cstring> #include<algorithm> #include<v ...

  6. HDU--4417 Super Mario (主席树模版题)

    题目链接 题目让求 L R区间 不大于H 的数有多少 数据太大需要离散化 #include<bits/stdc++.h> using namespace std; #define maxn ...

  7. BZOJ 2759 一个动态树好题(动态树)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 思路 每个节点仅有一条有向出边, 这便是一棵基环内向树,我们可以把它在 \(\text ...

  8. 使用jackson解析json串得到树模型,然后遍历树模型获得需要的数据

    Problem:从网址 http://quotes.money.163.com/hs/service/marketradar_ajax.php?host=http%3A%2F%2Fquotes.mon ...

  9. 树的总结(遍历,BST,AVL原型,堆,练习题)

    目录 树 一.抽象数据类型 二.二叉树的性质 三.二叉树的遍历 三.活用树的遍历 四.BST树 五.AVL树 六.BST树和AVL树练习 七.堆 树 @ 一.抽象数据类型 1.顺序存储 使用数组存储 ...

随机推荐

  1. Spring的applicationContext.xml的疑问解析

    Spring中注解注入 context:component-scan 的使用说明 通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动 ...

  2. DDD领域驱动设计(例子)

    参考:https://tech.meituan.com/DDD_in_%20practice.html

  3. java poi处理excel多sheet并实现排序

    需求:有一个数据字典全量汇总表,其中第一个sheet为目录,包括编号和表名,第二个以后为表的明细.其中sheet名就是表名但无序,sheet内字段序号无序有空行 现在要求将其中101,104,107, ...

  4. 【转】Intro to ShockBurst/Enhanced ShockBurst

    原地址https://devzone.nordicsemi.com/b/blog/posts/intro-to-shockburstenhanced-shockburst Wireless PC ac ...

  5. Phabricator代码审核Audit用户指南

    作者: shaneZhang 分类: 互联网技术 发布时间: 2015-07-04 13:37 概览 Phabricator支持两种代码审查工作流:“review”(提交前审查)和 “audit”(提 ...

  6. es6 初级之let

    1.在es6 中,定义变量使用 let. 1.1 var定义变量: <!DOCTYPE html> <html lang="en"> <head> ...

  7. [转载]Core Elements of a Program

    原文链接 http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00sc-introduction-to-c ...

  8. 在CentOS7中利用yum命令安装mysql

    在CentOS7中利用yum命令安装mysql 原创 2016年08月31日 10:42:33 标签: mysql / centos 4832 一.说明 我们是在VMware虚拟机上安装的mysql, ...

  9. 使用py2exe转换python文件为可执行程序

    py2exe可以将python脚本转换成在Windows上的可独立执行.exe程序的工具.可以让Python脚本在没有安装python工具的Windows系统上运行,方便脚本共享. 操作环境 pyth ...

  10. Android事件拦截机制 - 两句话

    模拟情形:ViewGroupA ->ViewGroupB->View False往下走,True就停下.(适用于事件传递和事件处理)