有一棵合法的二叉树,共有n个节点(1<=n<=1000),节点编号为(0~n-1),给定节点间的父子关系,求树的高度。
输入:第一行一个整数n,接下来有n-1行。每行两个整数,以空格分隔,第一个表示父节点编号,第二个表示子节点编号。
输出:树的高度
样例输入:
5
0 1
0 2
1 3
1 4样例输出
3这个题的关键是树的表示,其次是求树的高度:
(1)定义结构体用指针表示二叉树间节点关系
规规矩矩定义结点结构,构建一棵树,同时用指针数组存储下每个节点的地址,一遍为他添加孩子节点时能迅速找到。这个方法要完完整整写下来估计耗时不少。
(2)用数组表示
数组表示可能有多种,先说一维数组,当节点数目比较小时,可以考虑用完全二叉树的那种数组表示,2*n为左孩子,2*n+1为右孩子。但是有个巨大的问题是数组开多大,事实上当节点数为20的时候,数组就需要1024*1024这么大了,所以对于此题这种解法不可取(坑爹的我直接用的这个)
二维数组1001*2,我们可以用数组下标代表节点,每个节点2个单元,第一个单元表示左孩子下标,第二个单元表示右孩子单元。每次先存放左孩子单元,再存放右孩子。如果不存在就是-1。这样的话如tree[i][0]!=-1代表有左子树,tree[i][1]!=-1代表存在右子树,不断遍历,直到遇到-1为止。
下面给出用二维数组的方法
#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX=1001;
int tree[MAX][2]={0};
int high(int t[][2],int k)
{
if(t[k][0]==-1)return 1;
//else if(t[k]==1&&t[2*k]==0&&t[2*k+1]==0)return 1;
int hl=0,hr=0;
if(t[k][0]!=-1)hl=high(t,t[k][0]);
if(t[k][1]!=-1)hr=high(t,t[k][1]);
return hl>hr?hl+1:hr+1;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
tree[i][0]=-1;
tree[i][1]=-1;
}
int m=n-1;
int parent,child,root;
while(m)
{
cin>>parent>>child;
if(tree[parent][0]==-1)tree[parent][0]=child;
else tree[parent][1]=child;
if(m==n-1)root=parent;
m--;
}
int h=high(tree,root);
cout<<h<<endl;
return 0;
}
9万+



被折叠的 条评论
为什么被折叠?



