Aizu - ALDS1_7_B

2023-10-16 05:59
文章标签 aizu alds1

本文主要是介绍Aizu - ALDS1_7_B,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Binary Tree

题目

A binary tree is a tree with a root node in which every node has at most two children.

Your task is to write a program which reads a rooted binary tree T and prints the following information for each node u of T:

  • node ID of u
  • parent of u
  • sibling of u
  • the number of children of u
  • depth of u
  • height of u
  • node type (root, internal node or leaf)

If two nodes have the same parent, they are siblings. Here, if u and v have the same parent, we say u is a sibling of v (vice versa).

The height of a node in a tree is the number of edges on the longest simple downward path from the node to a leaf.

Here, the given binary tree consists of n nodes and evey node has a unique ID from 0 to n-1.

输入

The first line of the input includes an integer n, the number of nodes of the tree.

In the next n lines, the information of each node is given in the following format:

id left right

id is the node ID, left is ID of the left child and right is ID of the right child. If the node does not have the left (right) child, the left(right) is indicated by -1.

输出

Print the information of each node in the following format:

node id: parent = p, sibling = s, degree = deg, depth = dep, height = htype

p is ID of its parent. If the node does not have a parent, print -1.

s is ID of its sibling. If the node does not have a sibling, print -1.

degdep and h are the number of children, depth and height of the node respectively.

type is a type of nodes represented by a string (root, internal node or leaf. If the root can be considered as a leaf or an internal node, print root.

Please follow the format presented in a sample output below.

要求

  • 1 ≤ n ≤ 25

样例

Sample Input 1

9
0 1 4
1 2 3
2 -1 -1
3 -1 -1
4 5 8
5 6 7
6 -1 -1
7 -1 -1
8 -1 -1

Sample Output 1

node 0: parent = -1, sibling = -1, degree = 2, depth = 0, height = 3, root
node 1: parent = 0, sibling = 4, degree = 2, depth = 1, height = 1, internal node
node 2: parent = 1, sibling = 3, degree = 0, depth = 2, height = 0, leaf
node 3: parent = 1, sibling = 2, degree = 0, depth = 2, height = 0, leaf
node 4: parent = 0, sibling = 1, degree = 2, depth = 1, height = 2, internal node
node 5: parent = 4, sibling = 8, degree = 2, depth = 2, height = 1, internal node
node 6: parent = 5, sibling = 7, degree = 0, depth = 3, height = 0, leaf
node 7: parent = 5, sibling = 6, degree = 0, depth = 3, height = 0, leaf
node 8: parent = 4, sibling = 5, degree = 0, depth = 2, height = 0, leaf

 

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

AC代码

#include<bits/stdc++.h>
using namespace std;
struct node{
int r,l,p;
}T[10001];
int D[10001],H[10001];
void setdepth(int u,int d){if(u==-1)return;D[u]=d;setdepth(T[u].l,d+1);setdepth(T[u].r,d+1);
}
int setheight(int u){int h1=0,h2=0;if(T[u].l!=-1)h1=setheight(T[u].l)+1;if(T[u].r!=-1)h2=setheight(T[u].r)+1;return H[u]=max(h1,h2);
}
int getsibing(int u){if(T[u].p==-1)return -1;if(T[T[u].p].l!=u&&T[T[u].p].l!=-1)return T[T[u].p].l;if(T[T[u].p].r!=u&&T[T[u].p].r!=-1)return T[T[u].p].r;return -1;
}
void print(int i){printf("node %d: ",i);printf("parent = %d, ",T[i].p);printf("sibling = %d, ",getsibing(i));int degree=0;if(T[i].l!=-1)degree++;if(T[i].r!=-1)degree++;printf("degree = %d, ",degree);printf("depth = %d, ",D[i]);printf("height = %d, ",H[i]);if(T[i].p==-1)printf("root\n");else if(T[i].l==-1&&T[i].r==-1){printf("leaf\n");}else printf("internal node\n");
}
int main(){int n,id,left,right;scanf("%d",&n);for(int i=0;i<n;i++){T[i].p=-1;//	T[i].l=T[i].r=}for(int i=0;i<n;i++){scanf("%d%d%d",&id,&left,&right);T[id].l=left;T[id].r=right;if(left!=-1){T[left].p=id;}if(right!=-1){T[right].p=id;}}int root;for(int i=0;i<n;i++){if(T[i].p==-1)root=i;}setdepth(root,0);setheight(root);for(int i=0;i<n;i++){print(i);}return 0;
}

//求点赞,收藏

//写的不好

这篇关于Aizu - ALDS1_7_B的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/219534

相关文章

Aizu - 0118(深搜)

题目链接:点击打开链接 解析: 深搜无疑,和水洼那题类似。以查找过的赋值1,然后每次找不是1的位置,一搜一片即可。最后记录多少有片区域。 完整代码: #include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>#include <cmath>

Aizu 2541 Magical Bridges

题意: n个岛屿,由m条桥连接,其中有k条是魔法桥,你可以用魔法把他们变成相同长度。 求在执行魔法后,两个起点S1和S2到终点T的最短路的最小绝对差。 (1≤n≤1000,1≤m≤2000,1≤k≤100) (1\leq n\leq 1000,1\leq m\leq 2000,1\leq k\leq 100) S1 S_1和 S2 S_2到 T T的最短路将会是如 j×x+disj\t

Aizu 2538 Stack Maze【记忆化搜索】

其实我并不知道我的姿势算是什么。 一开始想着用二维的记忆化搜索,用 dp[x][y] dp[x][y]表示 (x,y)→(H,W) (x,y)\rightarrow(H,W)能够得到的最大happy值。但是很遗憾的是,这样没法记录,在前进的路上,我有多少个宝石、能够经过多少宝石洞。 所以就想着如何记录,最后发现难以记录。如果是这样的记忆化搜索,时间复杂度大约是 O(n2) O(n^2),那么就

Property Distribution Aizu - 0118

题目: タナカ氏が HW アールの果樹園を残して亡くなりました。果樹園は東西南北方向に H × W の区画に分けられ、区画ごとにリンゴ、カキ、ミカンが植えられています。タナカ氏はこんな遺言を残していました。 果樹園は区画単位でできるだけ多くの血縁者に分けること。ただし、ある区画の東西南北どれかの方向にとなりあう区画に同じ種類の果物が植えられていた場合は、区画の境界が分からないのでそれらは 1

ALDS1_5_D 2018-2-24

#include<iostream>#include<cstdio>using namespace std;const int MAX = 500000;const int maxnum = 1000000010;// 两个局部数组int L[MAX / 2 + 2], R[MAX / 2 + 2];int A[MAX], n;long long cnt ;// 排序和合并void

ALDS1_6_C 2018-2-24

#include<iostream>#include<cstdio>using namespace std;const int MAX = 100000;const int maxnum = 1000000010;struct Card {char suit;int value;};Card L[MAX / 2 + 2], R[MAX / 2 + 2];// 排序和合并void mer

ALDS1_5_C 2018-2-23

#include<iostream>#include<cstdio>#include<cmath>using namespace std;const double PI = acos(-1.0);struct Point{double x,y;};void koch(int n, Point a, Point b) {// 递归结束if (n == 0)return;// 三等分点s,t

ALDS1_4_D 2018-2-22

#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long LL;LL A[100000 + 10];int n, k;//模拟装货过程bool check(LL P) {int cnt = k;for (int i = 0; i < n; ) {LL t = P;

ALDS1_5_D 逆序数 2018-2-11

using namespace std;const int MAX = 500000;const int maxnum = 1000000010;// 两个局部数组int L[MAX / 2 + 2], R[MAX / 2 + 2];int A[MAX], n;long long cnt ;// 排序和合并void merge(int left, int mid, int right)

ALDS1_6_A

计数排序 执行步骤  首先将C数组下的每个元素A[i]的值累加起来,C[A[i]]++然后从前往后累加C数组,C[i] = C[i] + C[i-1],这样的累加过程实际上将数值为i的最大位置保存了,之后从最大位置往前填充数据。由于存在多个相同元素的情况,所以在输出A元素Ai前,先修正计数用的C[Ai],C[Ai]=C[Ai]−1。修正过程实际上是往前移动,因为C数组累加过程已经保证存储数字