找出二叉树中两个节点的最低共同父节点

算法设计:后续遍历此二叉树,将两个节点的父节点分别放入两个链表中,然后顺序对比,找出最后一个相同的节点,既是最低共同节点

C伪码实现:

List *h,*h1,*h2;

bool find1=false,find2=false;

void postVisit(BTNode *root)
{
      if(root!=null)
      {
          add(root,h);                         //将root结点加入以h为表头的链表中

          postVisit(root->lchild);
          if(root->lchild!=NULL)
               delete(root->lchild,h);         //从h链表中删除root右孩子结点

          postVisit(root->lchild);
          if(root->rchild!=NULL)
               delete(root->rchild,h);         //从h链表中删除root左孩子结点

          if(root->value == v1)
          {
                copy(h,h1);                    //找到第一个所需结点 将h链表中的所有节点copy到h1中
                find1=true;
          }
          else((root->value == v1))
          {
                copy(h,h2);                    //找到第二个所需结点 将h链表中的所有节点copy到h2中
                find2=true;
          }
          if(find1 && find2)                   //两个链表形成,退出后序遍历
                return;
       }
}

void findParentNode(BTNode *root)
{
       postVisit(root);

       for(List *p1=h1,*p2=h2;p1->next->node!=p2->next->node && p1!=NULL && p2!=NULL;p1=p1->next,p2=p2->next);
       
       if(p1->node!=p2->node)                 //此时没有公共结点,可能没有找到目标结点
             printf("not same parent");
       else
             printf(p1->node);                //输出最低公共结点
                
          
}
原文地址:https://www.cnblogs.com/biyeymyhjob/p/2600713.html