★实验任务

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实验题 地鼠安家的更多相关文章

  1. DS实验题 融合软泥怪-2 Heap实现

    题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...

  2. DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储

    题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...

  3. DS实验题 Dijkstra算法

    参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...

  4. DS实验题 sights

    算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...

  5. DS实验题 order

    算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...

  6. DS实验题 Order 已知父节点和中序遍历求前、后序

    题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...

  7. DS实验题 Inversion

    题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...

  8. DS实验题 Missile

    题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...

  9. DS实验题 击鼓传花

    题目: 代码1(数组实现): // // main.cpp // DS-击鼓传花 // // Created by wasdns on 16/11/9. // Copyright © 2016年 wa ...

随机推荐

  1. 自定义viewgroup实现ArcMenu

    最终效果如下 实现思路 通过效果图,会有几个问题: a.动画效果如何实现 可以看出动画是从顶点外外发射的,可能有人说,那还不简单,默认元素都在定点位置,然后TraslateAnimation就好了:这 ...

  2. .NET生成word文档服务器配置常见问题

    注意:安装office2003的时候一定要选择 "完全安装" 而不是 "典型安装" 错误:System.Runtime.InteropServices.COME ...

  3. LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例]

    1.首先实现一个interceptor,在请求开始的时候MDC put一个Session标志,interceptor结束的时候remove掉   import javax.servlet.http.H ...

  4. DataSet与Xml文件的互相转换

    DataSet转换为xml文件   //将DataSet转换为xml文件        private static void ConvertDataSetToXMLFile(DataSet xmlD ...

  5. [杂]SQL Server 之 Service Broker

    由于某些原因,我们的缓存依赖于数据库,而数据库反向通知需要依赖和使用ServiceBroker, 由于Deploy的人往往不是很清楚这个SB需要如何部署,特此记录. 判断数据库是否启用了Service ...

  6. 【vijos1659】河蟹王国 线段树<区间修改+区间最大值>

    描述 河蟹王国有一位河蟹国王,他的名字叫羊驼.河蟹王国富饶安定,人们和谐相处.有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人.于是,羊驼国王将他的子民排成了一列(==!!b汗~好长呀).每个人 ...

  7. 【word xml】将word转化为xml格式后,如何在xml中卫word添加分页符

    1.首先在xml中找到我们需要添加分页符的位置 例如:我需要在这个第一部分上面添加一个分页符 2.找到这个[第一部分]这个位置之后,开始往上找,找到对应的位置 3.在</w:pPr>下方添 ...

  8. 向数据库中添加内容 manageStdInfo.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="manageStdInfo.as ...

  9. mac OS X操作--快捷键

  10. 不用写软件,纯JS 实现QQ空间自动点赞

    这里分享一个自己写的点赞JS,已实现了好友动态.右侧栏猜你喜欢 点赞,有兴趣的朋友可以加上去玩玩.打开浏览器的开发者模式运行就可以看到效果了 var count = 0; var total = 0; ...