2015阿里巴巴笔试题第二题

//题目:写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。

/* 节点结构体*/
struct BTNode
{
	int ELEMENT;
	BTNode  *Lchild,*Rchild;
};
//返回最大值和最小值的函数
int max(int l ,int r)
{
	return (l > r ? l : r);
}
int min(int l, int r)
{
	return (l < r ? l : r);
}

//********************************方法一
int findMaxDiff(); // 返回这棵二叉树中相差最大的两个节点间的差值绝对值
int foo_max(BTNode * p); //找到树最大值
int foo_min(BTNode * p); //找到树最小值

int foo_max(BTNode * p)
{
	if (p == NULL)
		return -1*INT_MAX;
	int l = foo_max(p->Lchild);
	int r = foo_max(p->Rchild);
	l = max(l, r);
	return max(l, p->ELEMENT);
}
int foo_min(BTNode * p)
{
	if (p == NULL)
		return INT_MAX;
	int l = foo_min(p->Lchild);
	int r = foo_min(p->Rchild);
	l = min(l, r);
	return min(l, p->ELEMENT);
}
int findMaxDiff()
{
	return foo_max(root) - foo_min(root);
}


//*******************方法二
struct  max_min
{//同时包含最大值和最小值的结构体
	int max;
	int min;
}
max_min foo_max_min(BTNode * p); //同时找到最大值和最小值
max_min foo_max_min(BTNode * p)
{
	if (p == NULL)
	{
		max_min mm = {-1*INT_MAX , INT_MAX};
		return mm;
	}
	max_min l = foo_max_min(p->Lchild);
	max_min r = foo_max_min(p->Rchild);
	int t_max = max(l.max, r.max);
	int t_min = min(l.min, r.min);
	max_min t_max_min = { max(t_max, p->ELEMENT), min(t_min, p->ELEMENT) };
	return t_max_min;
}

int findMaxDiff()
{
	max_min mm= foo_max_min(root);
	return mm.max - mm.min;
}


posted @ 2014-08-29 21:08  旧客图新  阅读(145)  评论(0)    收藏  举报