题目描述 Description
给出一个二叉树,输出它的最大宽度和高度。
输入描述 Input Description
第一行一个整数n。
下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。如果没有某个儿子为空,则为0。
输出描述 Output Description
输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。
样例输入 Sample Input
5
2 3
4 5
0 0
0 0
0 0
import java.util.Scanner;
import java.util.Arrays;
class Node
{
int data;
Node left;
Node right;
public Node(int data)
{
this.data=data;
this.left=null;
this.right=null;
}
}
public class Main
{
static int lchild[]=new int[25];
static int rchild[]=new int[25];
static int width[]=new int[25];
static int height;
public static Node BuildTree(int data)
{
if(data==0) return null;
Node root=new Node(data);
root.left=BuildTree(lchild[data]);
root.right=BuildTree(rchild[data]);
return root;
}
public static void dfs(Node root,int x)
{
if(root!=null)
{
width[x]++;
if(x>height) height=x;
dfs(root.left,x+1);
dfs(root.right,x+1);
}
}
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
while(in.hasNext())
{
int n=in.nextInt();
Arrays.fill(width, 0);
height=0;
for(int i=1;i<=n;i++)
{
lchild[i]=in.nextInt();
rchild[i]=in.nextInt();
}
Node root=BuildTree(1);
dfs(root,1);
int max_width=0;
for(int i=1;i<=n;i++)
if(width[i]>max_width)
max_width=width[i];
System.out.println(max_width+" "+height);
}
}
}