有根树hi

文章描述了一个C++程序,用于给定有根树的每个节点计算其节点号、父节点号、深度和节点类型(根、内部节点或叶),并按照特定格式输出节点信息。程序使用递归方法遍历树结构。

创建一个程序,为给定的有根树 T 的每个节点 u 输出以下信息。

u的节点号
u的父节点号
u的深度
u的节点类型(根、内部节点或叶)
u的孩子名单
这里我们假设给定的树有n个节点,每个节点都分配了一个从0到n-1的数字。

输入
输入的第一行给出节点数 n。在接下来的第 n 行,每个节点的信息按以下格式在一行中给出。
id k c1 c2 ... ck

id 是节点号,k 是顺序。 c1 c2 ... ck 表示第一个子节点的节点号,... 表示第k 个子节点的节点号。

输出
按照以下格式输出节点信息。按编号升序输出节点信息。

node id: parent = p, depth = d, type, [c1...ck]

p 表示父编号。但是,如果您没有父级,请将其设置为 -1。 d 表示节点的深度。
type 是分别代表根、内部节点和叶的根、内部节点或叶字符串之一。但是,如果根满足叶子和内部节点的条件,则应该是根。
c1 ... ck 是一个孩子的列表。请将其视为一个序列树,并按照输入的顺序输出。请注意逗号空格分隔符。检查输出示例中的输出格式。

约束
1 ≤ n ≤ 100,000
节点深度不超过20。
任何两个节点之间总是有一条路径。

输入样例


13 0 3 1 4 10 1 2 2 3 2 0 3 0 4 3 5 6 7 5 0 6 0 7 2 8 9 8 0 9 0 10 2 11 12 11 0 12 0

输出样例


node 0: parent = -1, depth = 0, root, [1, 4, 10] node 1: parent = 0, depth = 1, internal node, [2, 3] node 2: parent = 1, depth = 2, leaf, [] node 3: parent = 1, depth = 2, leaf, [] node 4: parent = 0, depth = 1, internal node, [5, 6, 7] node 5: parent = 4, depth = 2, leaf, [] node 6: parent = 4, depth = 2, leaf, [] node 7: parent = 4, depth = 2, internal node, [8, 9] node 8: parent = 7, depth = 3, leaf, [] node 9: parent = 7, depth = 3, leaf, [] node 10: parent = 0, depth = 1, internal node, [11, 12] node 11: parent = 10, depth = 2, leaf, [] node 12: parent = 10, depth = 2, leaf, []

#include<iostream>
using namespace std;
#define MAX 100005
#define NIL -1
struct Node { int p, l, r; };
Node T[MAX];
int n, D[MAX];
void print(int u){
    int i, c;
    cout<<"node "<<u<<": ";
    cout<<"parent = "<<T[u].p<<", ";
    cout<<"depth = "<<D[u]<<", ";
    if(T[u].p == NIL) cout<<"root, ";
    else if(T[u].l == NIL) cout<<"leaf, ";
    else cout<<"internal node, ";
    cout<<"[";    
    for(i = 0, c = T[u].l; c != NIL; i++, c = T[c].r){
        if(i) cout<<", ";
        cout<<c;
    } 
    cout<<"]"<<endl;
}
int rec(int u, int p){
    D[u] = p;
    if (T[u].r != NIL) rec(T[u].r, p);
    if (T[u].l != NIL) rec(T[u].l, p + 1); 
}
int main(){
    int i, j, d, v, c, l, r;
    cin>>n;
    for(i = 0; i < n; i++) T[i].p = T[i].l = T[i].r = NIL;
    
    for(i = 0; i < n; i++){
        cin>>v>>d;
        for(j = 0; j < d; j++){
            cin>>c;
            if(j == 0) T[v].l = c;
            else T[l].r = c;
            l = c;
            T[c].p = v;
        }
    }
    for(i = 0; i < n; i++){
        if(T[i].p == NIL) r = i;
    }
    rec(r, 0);
    for(i = 0; i < n; i++) print(i);
    return 0;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值