二叉樹兩個結點的最低共同父結點

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章