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