DS实验题 地鼠安家
★实验任务
fd是一个公认的美丽校园。一天,fd来了一群地鼠,编号为1到n,他们希望在这里定居。现在先由第一只地鼠往下打一个单位的距离,并且在那里安家。对于每一个已经安家的地鼠,如果他左下或右下没有邻居,那还没安家的地鼠就可以在他的左下或者右下安家。地鼠们已经建完所有的窝了,他们评价这些窝合格的标准是它们能不能形成一棵二叉搜索树(二叉搜索树的定义见课本)。现在需要你帮助他们评估一下他们的窝挖的是否合格。

★数据输入
第1行一个整数n,表示地鼠总共n只。接下来一共n行,每一行三个数:l,o,r,其中l表示编号为o的地鼠的左邻居的编号,r表示的是编号为o的右邻居的编号,如果没有左邻居或右邻居,则l或r为-1。1<=n<=10000。保证给出的是一颗二叉树。
★数据输出
输出一行,如果如果他们的窝合格,则输出安居在最深的窝的地鼠离地面的距离,如果不合格,则输出-1。
输入示例
5
-1 1 -1
1 2 3
-1 3 -1
2 4 5
-1 5 -1
输出示例
3
代码实现
//
// main.cpp
// 地鼠打洞
//
// Created by wasdns on 16/10/26.
// Copyright © 2016年 wasdns. All rights reserved.
//
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <string>
#include <stack>
using namespace std;
#define fMax -10000;
struct Tree {
Tree *l;
Tree *r;
int num;
int lnum;
int rnum;
int flag;
}s[10005];
/*
Tree* IniNode() {
Tree *p;
p = new Tree;
if (p == NULL) {
cout << "Error" << endl;
exit(1);
}
return p;
}
*/
Tree* CreatTree(int n) {
int i, j;
int lturn, rturn;
for (i = 0; i < n; i++) {
lturn = s[i].lnum;
rturn = s[i].rnum;
if (lturn == -1 && rturn == -1) continue;
else {
if (lturn != -1 && rturn == -1) {
for (j = 0; j < n; j++) {
if (s[j].num == lturn) {
s[i].l = &s[j];
s[j].flag = 1;
break;
}
}
}
else if (lturn == -1 && rturn != -1) {
for (j = 0; j < n; j++) {
if (s[j].num == rturn) {
s[i].r = &s[j];
s[j].flag = 1;
break;
}
}
}
else {
for (j = 0; j < n; j++) {
if (s[j].num == lturn) {
s[i].l = &s[j];
s[j].flag = 1;
}
if (s[j].num == rturn) {
s[i].r = &s[j];
s[j].flag = 1;
}
}
}
}
}
Tree *header;
for (i = 0; i < n; i++) {
if (s[i].flag == 0) {
header = &s[i];
break;
}
}
return header;
}
int t = fMax;
bool TreeJudge(Tree *p) {
bool jr = true;
if (p != NULL) {
bool j1 = TreeJudge(p -> l);
if (!j1) {
jr = false;
return jr;
}
if (p -> num < t) {
jr = false;
return jr;
}
else {
t = p -> num;
}
bool j2 = TreeJudge(p -> r);
if (!j2) {
jr = false;
return jr;
}
}
return jr;
}
int TreeHeight(Tree* header) {
int lheight = 0;
int rheight = 0;
if (!header) return 0;
else {
lheight = TreeHeight(header -> l);
rheight = TreeHeight(header -> r);
if (lheight > rheight) {
return lheight + 1;
}
else {
return rheight + 1;
}
}
return 0;
}
int main() {
int n;
int i;
cin >> n;
for (i = 0; i < n; i++) {
cin >> s[i].lnum >> s[i].num >> s[i].rnum;
s[i].l = NULL;
s[i].r = NULL;
s[i].flag = 0;
}
Tree *header;
header = CreatTree(n);
if (!TreeJudge(header)) {
cout << "-1" << endl;
}
else {
cout << TreeHeight(header) << endl;
}
return 0;
}
2016/10/30
DS实验题 地鼠安家的更多相关文章
- DS实验题 融合软泥怪-2 Heap实现
题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...
- DS实验题 Dijkstra算法
参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...
- DS实验题 sights
算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...
- DS实验题 order
算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...
- DS实验题 Order 已知父节点和中序遍历求前、后序
题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...
- DS实验题 Inversion
题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...
- DS实验题 Missile
题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...
- DS实验题 击鼓传花
题目: 代码1(数组实现): // // main.cpp // DS-击鼓传花 // // Created by wasdns on 16/11/9. // Copyright © 2016年 wa ...
随机推荐
- cjb
输入216.194.70.6 ,进入到是cjb.net的主页,并不是shell.cjb.net ,进入主页后点击shell,就进不去了 分析:shell.cjb.net被DNS污染了 解法:hosts ...
- register
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很 ...
- 设计模式学习起点 UML类图笔记
UML类图笔记 大学开设的软件设计课程一般都会学习UML类图,大部分关于设计模式的描述都是使用的UML类图,可以说类图的表示是学习设计模式的起点.UML定义类之间的关系主要有六种:泛化关系.实现关系. ...
- display : -webkit-box-inline 的理解
发现: 最近在做移动端的东西,说起移动端弹性盒子布局真是无往不利,用起来特别爽,我也是偶尔间发现的这个属性并且它的用法,在网上基本查不到这个属性的资料(个人看法).如果没有听说过(display:bo ...
- C# WebProxy POST 或者 GET
代理服务器无账号和密码的代理服务器: //创建请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); //实例化一个We ...
- 惊鸿一瞥(Glimpse)——开发之时即可掌控ASP.NET应用的性能
今天要推荐的东西不是一篇文章,而是我实际使用的武器之一--用于ASP.NET应用性能诊断的大杀器.我的武器库中的武器之前已经介绍过Hangfire了,接下来我会不断和大家分享我使用的一些函数库和工具. ...
- ServletContext中常用方法(getRsource和getResourceAsStream)
转自:http://blog.csdn.net/yakson/article/details/9203267 一..获取Tomcat的Context的初始化参数. 1.获取Tomcat的server. ...
- loj 1185(bfs)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26898 思路:我们可以给定有直接边相连的两点的距离为1,那么就是求 ...
- Oracle生成千万测试数据
oracle 生成千万测试数据 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试 ...
- loadrunner关联的感悟:
首先用URL模式录制脚本: 切换到树模式下: 很容易查看到关联的位置,由此知道产生动态值得请求为nav.pl 但是在html中我们怎么查看关联值在哪里呢: 今天无意中意识到这个问题: 先看树视图脚本: