数据结构作业——地鼠安家(二叉搜索树)
地鼠安家 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代码
#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; }
#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; }
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆