【Aizu-ALDS1_7_B】Binary Trees 树 (4/1000)

16 篇文章 0 订阅
2 篇文章 0 订阅

Description

A rooted 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.

Input

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.

Output

Print the information of each node in the following format:

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

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.

deg, dep 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.

Constraints

  • 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.

这题太坑了,不,是我太弱了,从晚wa到早,一道很简单的题,好像是日本那边的题目,就是给你一棵树,然后叫你输出各个节点信息,双亲parent,兄弟sibling,度数degree,深度depth,高度height,类型type,我写了一个很强大的函数,一次性把所有都求出来了,但是就不知为什么一直就wa,后来我终于发现。
原来下面这种写法是错的

cin>>v>>tree[v].l>>tree[v].r;

这样才是对的

cin>>v>>l1>>r1;
tree[v].l=l1;
tree[v].r=r1;

切记。

AC代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10000;
struct node{
    int l,r,p,s,deg,dep,h;
};
int n,v,l1,r1,tmp,root;
int vis[N]={0};
node tree[N];


int build(int k,int depth){
    if ((tree[k].l==-1)&&(tree[k].r==-1)) {
        tree[k].deg=0;
        tree[k].dep=depth;
        return tree[k].h=0;
    }
    else if ((tree[k].l!=-1)&&(tree[k].r!=-1)){
        tree[tree[k].l].p=k;
        tree[tree[k].r].p=k;
        tree[tree[k].l].s=tree[k].r;
        tree[tree[k].r].s=tree[k].l;
        tree[k].deg=2;
        tree[k].dep=depth;
        return tree[k].h=max(build(tree[k].l,depth+1),build(tree[k].r,depth+1))+1;
    }
    else if (tree[k].l!=-1){
        tree[tree[k].l].p=k;
        tree[tree[k].l].s=-1;
        tree[k].deg=1;
        tree[k].dep=depth;
        return tree[k].h=build(tree[k].l,depth+1)+1;        
    }
    else if (tree[k].r!=-1){
        tree[tree[k].r].p=k;
        tree[tree[k].r].s=-1;
        tree[k].deg=1;
        tree[k].dep=depth;
        return tree[k].h=build(tree[k].r,depth+1)+1;        
    }



}
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>v>>l1>>r1;
        tree[v].l=l1;
        tree[v].r=r1;
        if (tree[v].l!=-1) vis[tree[v].l]=1;
        if (tree[v].r!=-1) vis[tree[v].r]=1;
    }
    for(int i=0;i<n;i++){
        if (vis[i]==0){
            root=i;
            break;
        }
    }
    build(root,0);
    tree[root].p=-1;
    tree[root].s=-1;
    for(int i=0;i<n;i++){
        printf("node %d: parent = %d, sibling = %d, degree = %d, depth = %d, height = %d, ",i,tree[i].p,tree[i].s,tree[i].deg,tree[i].dep,tree[i].h);
        if (i==root) printf("root");
        else if(tree[i].l==-1&&tree[i].r==-1) printf("leaf");
        else printf("internal node");
        printf("\n");
    }
    return 0;
}

不过,后来想了一下把所有东西写成一个函数,这种写法不太好,没有让函数模块化,什么都糅杂在一起,而且自己也不能很好的辨别,那些信息是需要遍历树才能获取的,那些信息时不需要遍历就能获取的。

还有,为什么markdown的C++代码这么丑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值