求二叉树中p和q的最近公共祖先

算法思想:利用后序非递归遍历,借助栈来实现。假设p在q的左边。第一步,利用栈先遍历到p所指结点,这时栈中全是p的祖先,第二步,将栈中元素全部复制到另一个栈中,继续遍历,直到q结点出现,此时遍历结束。让栈1和栈2中元素进行比较匹配,第一个相等的即为最近公共祖先。

Typedef struct{
   BiTree t;
   int tag;//tag=0表示左子女已被访问,tag=1表示右子女已被访问
  }stack;

Stack s[],s1[];//栈

BiTree Ancestor(BiTree ROOT,BiTree *p,BiTree *q){

  top=0;bt=ROOT;
  while(bt!=null||top>0){
    while(bt!=null){
      S[++top]=bt;
      S[top].tag=0;
      bt=bt->lchild;
     }//沿左分支遍历
  while(top!=0&& s[top].tag==1){//右子女已被访问,假定p在q的左侧
    if(s.[top].t==p){
      for(i=1;i<=top;i++)
        S1[i]=s[i];
        top1=top;
       }//将栈内元素复制到栈s1中

    if(s[top].t==q)//找到p结点
      for(i=top;i>0;i—-){
        for(j=top1;j>0;j—-)//将栈s和s1中元素进行匹配
          if(s1[j].t==s[i].t)//找到相等结点
             return s[i].t;//找到并返回值
         }
         top - -;//退栈
    }
    if(top!=0){
      S[top]. tag=1;
      bt=s[top].t->rchild;沿右分枝
     }
    }
  return Null;//无公共祖先
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值