数据结构作业——地鼠安家(二叉搜索树)
地鼠安家 1
Description
fd 是一个公认的美丽校园。一天, fd 来了一群地鼠,编号为 1 到 n,他们希望 在这里定居。现在先由第一只地鼠往下打一个单位的距离,并且在那里安家。对 于每一个已经安家的地鼠,如果他左下或右下没有邻居,那还没安家的地鼠就可 以在他的左下或者右下安家。地鼠们已经建完所有的窝了,他们评价这些窝合格 的标准是它们能不能形成一棵二叉搜索树( 二叉搜索树的定义见课本)。现在需 要你帮助他们评估一下他们的窝挖的是否合格。
Input
第 1 行一个整数 n,表示地鼠总共 n 只。接下来一共 n 行,每一行三个数: l,o,r,其中 l 表示编号为 o 的地鼠的左邻居的编号, r 表示的是编号为 o 的右邻居的编号,如果没有左邻居或右邻居,则 l 或 r 为-1。 1<=n<=10000。 保证给出的是一颗二叉树。
Output
输出一行,如果如果他们的窝合格,则输出安居在最深的窝的地鼠离地面的距离,如果
不合格,则输出-1。
不合格,则输出-1。
Sample Input
5
-1 1 -1
1 2 3 -
1 3 -1
2 4 5
-1 5 -1
Sample Output
3
思路
二叉搜索树中序遍历得到的是一个严格上升序列,因此可以通过判断中序遍历的结果是否是上升序列来解,也可以在搜索的时候直接判断是否符合二叉搜索树的定义。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 10005; int lson[maxn],rson[maxn],indeg[maxn]; bool flag = false ; void dfs( int fa) { if (lson[fa] != -1) dfs(lson[fa]); if (lson[fa] != -1 && lson[fa] >= fa) flag = true ; if (rson[fa] != -1) dfs(rson[fa]); if (rson[fa] != -1 && rson[fa] <= fa) flag = true ; } int GetHeight( int fa) { if (fa == -1) return -1; int lh = GetHeight(lson[fa]); int rh = GetHeight(rson[fa]); return lh>rh?++lh:++rh; } int main() { freopen ( "data.txt" , "r" ,stdin); //freopen("1.txt","w",stdout); int n,ls,fa,rs,i; memset (lson,-1, sizeof (lson)); memset (rson,-1, sizeof (rson)); memset (indeg,0, sizeof (indeg)); scanf ( "%d" ,&n); for (i = 0;i < n;i++) { scanf ( "%d%d%d" ,&ls,&fa,&rs); lson[fa] = ls,rson[fa] = rs; indeg[ls]++,indeg[rs]++; } int root; for (i = 1;i <= n;i++) { if (!indeg[i]) { root = i; break ; } } dfs(root); if (flag) printf ( "-1\n" ); else printf ( "%d\n" ,GetHeight(root)+1); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 10005; int p = 0,lson[maxn],rson[maxn],indeg[maxn],a[maxn]; void inorder( int x) { if (x != -1) { inorder(lson[x]); a[p++] = x; inorder(rson[x]); } } int height( int x) { if (x == -1) return -1; int lh = height(lson[x]); int rh = height(rson[x]); return lh>rh?++lh:++rh; } int main() { int i,n,l,r,fa; memset (lson,-1, sizeof (lson)); memset (rson,-1, sizeof (rson)); memset (indeg,0, sizeof (indeg)); scanf ( "%d" ,&n); for (i = 0;i < n;i++) { scanf ( "%d%d%d" ,&l,&fa,&r); lson[fa] = l; rson[fa] = r; indeg[l]++; indeg[r]++; } int root; for (i = 1;i <= n;i++) { if (!indeg[i]) { root = i; break ; } } inorder(root); bool flag = false ; for (i = 1;i < n;i++) { if (a[i] != a[i-1] + 1) { flag = true ; break ; } } if (flag) printf ( "-1\n" ); else printf ( "%d\n" ,height(root)+1); return 0; } |
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)