九度oj 1541 二叉树
原题链接:http://ac.jobdu.com/problem.php?pid=1541
简答题如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
const int Max_N = ;
struct Node{
int v, s;
Node *pre, *ch[];
inline void set(int _v = , int _s = , Node *p = NULL){
v = _v, s = _s;
pre = ch[] = ch[] = p;
}
inline void push_up(){
s = ch[]->s + ch[]->s + ;
}
inline void link(Node *x, bool d){
ch[d] = x;
x->pre = this;
}
};
struct SplayTree{
Node *tail, *root, *null;
Node stack[Max_N], *ptr[Max_N];
void init(){
tail = &stack[];
null = tail++;
null->set();
root = null;
}
inline Node *newNode(int v){
Node *p = tail++;
p->set(v, , null);
return p;
}
inline void rotate(Node *x, int d){
Node *y = x->pre;
y->ch[!d] = x->ch[d];
if (x->ch[d] != null) x->ch[d]->pre = y;
x->pre = y->pre;
if (y->pre != null) y->pre->ch[y->pre->ch[] != y] = x;
x->ch[d] = y;
y->pre = x;
y->push_up(), x->push_up();
if (y == root) root = x;
}
inline void update(Node *x){
if (x != null){
update(x->ch[]);
update(x->ch[]);
x->push_up();
}
}
void gogo(int n){
int i, a, b;
for (i = ; i <= n; i++) ptr[i] = newNode(i);
for (i = ; i <= n; i++){
scanf("%d %d", &a, &b);
if (- == a || - == b){
if (- == a && b != -) ptr[i]->link(ptr[b], );
if (- == b && a != -) ptr[i]->link(ptr[a], );
} else {
ptr[i]->link(ptr[a], );
ptr[i]->link(ptr[b], );
}
ptr[i]->push_up();
if (ptr[i]->pre == null) root = ptr[i];
}
update(root);
}
inline void work(){
int i, t;
char buf[];
scanf("%d", &t);
while (t--){
scanf("%s %d", buf, &i);
if ('s' == buf[]){
printf("%d\n", ptr[i]->s);
} else if ('r' == buf[]){
if (ptr[i] == root) continue;
rotate(ptr[i], ptr[i]->pre->ch[] == ptr[i]);
} else {
if (ptr[i] == root) printf("-1\n");
else printf("%d\n", ptr[i]->pre->v);
}
}
}
}spt;
int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w+", stdout);
#endif
int n;
while (~scanf("%d", &n)){
spt.init(), spt.gogo(n), spt.work();
}
return ;
}
九度oj 1541 二叉树的更多相关文章
- 九度OJ 1541 二叉树【数据结构】
题目地址:http://ac.jobdu.com/problem.php?pid=1541 题目描述: 旋转是二叉树的基本操作,我们可以对任意一个存在父亲节点的子节点进行旋转,包括如下几种形式(设被旋 ...
- 九度oj 1184 二叉树遍历
原题链接:http://ac.jobdu.com/problem.php?pid=1184 简单的二叉树重建,遍历. 如下: #include<cstdio> #include<cs ...
- [九度OJ]1078.二叉树的遍历(重建)
原题链接:http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其 ...
- [九度OJ]1113.二叉树(求完全二叉树任意结点所在子树的结点数)
原题链接:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...
- 九度OJ 1113 二叉树
题目地址:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...
- 九度OJ 1078 二叉树遍历
题目地址:http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历 ...
- 九度oj 1521 二叉树的镜像
原题链接:http://ac.jobdu.com/problem.php?pid=1521 水题,如下.. #include<algorithm> #include<iostream ...
- 【九度OJ】题目1113:二叉树 解题报告
[九度OJ]题目1113:二叉树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3-- ...
- 【九度OJ】题目1078:二叉树遍历 解题报告
[九度OJ]题目1078:二叉树遍历 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历 ...
随机推荐
- autoit UIA获取Listview的信息
#include "CUIAutomation2.au3" Opt( ) Global $oUIAutomation MainFunc() Func MainFunc() ; Be ...
- java.lang.NumberFormatException: For input string: "Y"
nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. ...
- 【Hibernate 5】继承映射配置及多态查询
一.继承实现的三种策略 1.1,单表继承.每棵类继承树使用一个表(table per class hierarchy) -->本文主要介绍的继承策略 类继承树对应多个类,要把多个类的信息存放在一 ...
- JDBC链接MySQL和Oracle
import java.sql.*; JDBC中所要用的包几乎都在import?java.sql.*;中: 在项目中导入Oracel或者是MySQL包和装载驱动: 项目的Cla ...
- IRS-P6数据介绍
IRS-P6发射于2003年10月17日,星上携带三个传感器:多光谱传感器LISS4和LISS3,以及高级广角传感器AWIFS.LISS3传感器具有四个光谱波段分别位于可见光.近红外与短波红外区域,空 ...
- TortoiseSVN文件夹图标不显示的解决方法
是否遇到过TortoiseSVN安装好后,发现文件夹的图标还是Windows默认的图标? 下面通过简单几步解决图标不显示的问题. 1/6 "Win + R"打开运行框,输入&quo ...
- php 导出csv
public function doworks(){ //输出Excel文件头,可把user.csv换成你要的文件名 header('Content-Type: appli ...
- Bootstrap CSS 描述
<!DOCTYPE html><html lang="zh-CN"><head> <!--定于内容,和内容的编码格式--> < ...
- 如何获取tableview中当前选中的cell
当我们点击某个cell时,会执行下面这个方法,方法中调用另一方法执行具体操作: - (void)tableView:(UITableView *)tableView didSelectRowAtInd ...
- NASM编译器的$和$$标记
NASM中的times相当于MASM中的dup起到重复定义的作用. $表示当前行的偏移地址,$$表示当前段的起始偏移地址, ;------------------------------------- ...