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;  
}  

轉自:http://blog.csdn.net/denglfs/article/details/38930453
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章