小米笔试题:树的高度

题目链接:树的高度

用并查集的方法做的。
这个题不是表述有问题,就是测试数据有问题。题目说了是合法的二叉树,但是测试数据是有多叉树的。
要把多余的树枝砍掉,就是说如果这个结点出现了第三个孩子,我们就不要去考虑第三个孩子。
并查集的思路就是构造出这么一棵树,然后如果出现第三个孩子及以上,把它标记出来,搜索的时候,搜索到这个孩子的时候就认为不合法。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6+5;
int fa[maxn];
int child[maxn];
int vis[maxn];
int dfs(int i); 
void init()				//初始化 
{
	for(int i=0;i<maxn;++i)
	{
		fa[i]=i;		//一开始让所有的节点都做自己的父亲 
		child[i]=0;		//表示这个节点有多少个孩子 
		vis[i]=0;		//1表示这个节点是不合法的,0表示是合法的 
	}
}
void join(int x,int y)	//x是y的父亲 
{
	child[x]++;			//x的孩子数加1 
	if(child[x]>=3)		//如果孩子的节点数大于等于3,则表示这个孩子不合法 
	{
		vis[y]=1;		//因为不合法,所以标记一下 
		return ;
	}
	fa[y]=x;			//让y的父亲是x 
	return ;
}
int main()
{
	int n,x,y;
	while(cin>>n)
	{
		init();
		for(int i=0;i<n-1;i++) 
		{
			cin>>x>>y;
			join(x,y);	
		}
		int big_num=0,a;		//big_num表示树的高度,a表示每个节点的高度 
		for(int i=0;i<n-1;i++)
		{
			a=dfs(i);
			big_num=big_num>a?big_num:a;	//如果这个节点比以前的都大,则更新答案 
		}
		cout<<big_num<<endl;
	}
	return 0;
}
int dfs(int i)			//对i这个节点进行搜索 
{
	int tree_len=1;		//初始化该节点的高度为1 
	int t=i;
	while(t!=fa[t])		//如果t不是根节点本身 
	{
		t=fa[t];		//则访问它的父亲节点 
		tree_len++;		//树的长度+1 
	}
	if(vis[t]) return 0;//如果该节点不合法,直接返回长度0 
 	return tree_len;	
}

猜你喜欢

转载自blog.csdn.net/q1122333/article/details/82970720