100題第75題
題目:二叉樹的結點定義如下:
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
輸入二叉樹中的兩個結點,輸出這兩個結點在數中最低的共同父結點。
分析:求數中兩個結點的最低共同結點是面試中經常出現的一個問題。這個問題至少有兩個變種
struct Tnode
{
int a;
Tnode *l;
Tnode *r;
Tnode()
{
l = NULL;
r = NULL;
}
};
Tnode * find(Tnode * n1, Tnode * n2, Tnode * h)
{
std::vector<Tnode *> vec1;
std::vector<Tnode *> vec2;
Tnode * p = h;
while(p!=n1)
{
if(NULL!=p)
{
vec1.push_back(p);
p = p->l;
}
else
{
do
{
p = vec1.back();
vec1.pop_back();
}while(p==vec1.back()->r);
p = vec2.back()->r;
}
}
p = h;
while(p!=n2)
{
if(NULL!=p)
{
vec2.push_back(p);
p = p->l;
}
else
{
do
{
p = vec2.back();
vec2.pop_back();
}while(p==vec2.back()->r);
p = vec2.back()->r;
}
}
int m = (int)vec1.size();
int l = (int)vec2.size();
if(m > l) m = l;
if(m>0)
{
for(int i=1;i<m;i++)
if(vec1[i] != vec2[i])
break;
return vec1[i-1];
}
else
return NULL;
}