A1130 | 中缀表达式、查找根节点
代码:
#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map> #define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 10000
#define MAX 0x06FFFFFF
#define V vector<int> using namespace std; typedef struct inputInfo{
string d;int l,r;
}inputInfo; typedef struct Node{
string d;struct Node * l=NULL;struct Node * r=NULL;
Node(){}
Node(string D){d=D;}
}Node; inputInfo infoArr[];
Node *nodes[];
int used[];
Node * insert_node(int index);
void inOrder(Node* node);
Node * root;
int cnt=; int main() {
freopen("d:/input/A1130/1.txt","r",stdin);
int N,i;
scanf("%d",&N);
F(i,,N+){
char buffer[];
scanf("%s %d %d",buffer,&infoArr[i].l,&infoArr[i].r);
infoArr[i].d=buffer;
}
F(i,,N+){
if(!used[i])insert_node(i);
if(cnt>=N) break;
}
// printf("%d %d\n",cnt,i);
root=nodes[i];
inOrder(root->l);
printf("%s",root->d.c_str());
inOrder(root->r);
return ;
} Node * insert_node(int index){
used[index]=;
cnt++;
inputInfo info=infoArr[index];
Node *node=new Node(info.d); int l=info.l,r=info.r;
if(l>)
if(used[l]){
node->l=(nodes[l]);
}else{
node->l=insert_node(l);
}
if(r>)
if(used[r]){
node->r=(nodes[r]);
}else{
node->r=insert_node(r);
}
nodes[index]=node; return node;
} void inOrder(Node* node){
if(node){
bool haveK=(node->l||node->r)?:;
if(haveK) O("(");
inOrder(node->l);
printf("%s",node->d.c_str());
inOrder(node->r);
if(haveK) O(")");
}
}
主要的点有两个。首先是中缀表达式:
void inOrder(Node* node){
if(node){
bool haveK=(node->l||node->r)?:;
if(haveK) O("(");
inOrder(node->l);
printf("%s",node->d.c_str());
inOrder(node->r);
if(haveK) O(")");
}
}
inOrder(root->l);
printf("%s",root->d.c_str());
inOrder(root->r);
对中序遍历稍加修改,就可以得到像这样的中缀表达式:(a+b)*(c*(-d))
其次是录入输入信息后怎样不浪费时间,巧妙的找到根节点是哪一行记录。这里我们用nodes数组记录树形结点,用used数组记录是否访问过,用cnt记录形成结点的个数,然后递归调用insert_node,就可以及时找到根节点的记录。
需要进步的点:做题速度太慢。
A1130 | 中缀表达式、查找根节点的更多相关文章
- 【转】oracle CONNECT BY PRIOR叶子节点查找根节点
SELECT TRANS_ID FROM TRANS_INST WHERE connect_by_isleaf=1 START WITH TRANS_ID =480242 CONNECT BY PRI ...
- C#操作XML学习之创建XML文件的同时新建根节点和子节点(多级子节点)
最近工作中遇到一个问题,要求创建一个XML文件,在创建的时候要初始化该XML文档,同时该文档打开后是XML形式,但是后缀名不是.在网上找了好些资料没找到,只能自己试着弄了一下,没想到成功了,把它记下来 ...
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放
01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...
- 通过不断迭代,编写<通过中缀表达式,构造表达式树>的代码
今天要练习的算法是通过中缀表达式生成表达式树.中缀.前缀.后缀表达式的概念就不赘述了,学习链接:中缀.前缀.后缀表达式. 参考代码学习链接:表达式树—中缀表达式转换成后缀表达式(一). [迭代 ①]: ...
- hdu 2545(并查集求节点到根节点的距离)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545 思路:dist[u]表示节点u到根节点的距离,然后在查找的时候更新即可,最后判断dist[u], ...
- C#用xpath查找某节点
C#用xpath查找某节点 从根节点一直下来的相对路径才能确定Xpath的写法. /root/<节点1>/<节点2>//<@属性> Xpath是功能很强大的,但是也 ...
- 二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)
将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: typedef struct TreeNode{ int data; struct TreeNode *le ...
- 用TinyXml做XML解析示例 TinyXml查找唯一节点及修改节点操作
// 读者对象:对TinyXml有一定了解的人.本文是对TinyXml工具的一些知识点的理解. // 1 TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的. // enum No ...
- MySQL InnoDB primary key根节点常驻内存
mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作.
随机推荐
- Throwable中几个常见方法。
getMessage();//获取异常信息,返回字符串.例如: toString();//获取异常类名和异常信息,返回字符串.例如: printStackTrace();//获取异常类名和异常信息,以 ...
- 【转载】 C#中ArrayList集合类的使用
在C#的集合操作过程中,我们一般常用的集合类为List集合,List集合是一种强类型的泛型集合,其实还有一个ArrayList集合类,ArrayList集合类则非泛型类的集合,并且ArrayList集 ...
- elementUI一次请求上传多个文件
elementui <el-upload class="upload-demo" ac ...
- jQuery基础学习
一.简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“Write ...
- Java 之 LinkedList 集合
一.LinkedList 概述 java.util.LinkedList 集合数据存储的结构是链表结构. 特点:增删快,查询慢 LinkedList 是一个双向链表,如下图 注意:该集合实现不是同步 ...
- android.view.ViewRoot$CalledFromWrongThreadException 异常的解决方案
https://blog.csdn.net/vincent_czz/article/details/7070354 https://stackoverflow.com/questions/210141 ...
- Centos7 rsync+inotify实现实时同步更新
inotify slave部署 把master上指定文件下载到本地的主机指定目录 yum install rsync –y [root@localhost ~]# useradd rsync ...
- 排序算法的c++实现——归并排序
归并排序是典型分治思想的代表——首先把原问题分解为两个或多个子问题,然后求解子问题的解,最后使用子问题的解来构造出原问题的解. 对于归并排序,给定一个待排序的数组,首先把该数组划分为两个子数组,然后对 ...
- prometheus学习系列十一: Prometheus和AlertManager的高可用
前面的系列中, prometheus和alertmanager都是单机部署的,会有单机宕机导致系统不可用情况发生.本文主要介绍下prometheus和alertmanager的高可用方案. 服务的高可 ...
- windows创建虚拟环境
mkvirtualenv --no-site-packages --python=C:\Python36\python.exe MyCrawler