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

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

 

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);                //输出最低公共结点
                
          
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值