找出二叉树上任意两个结点的最近共同父结点。

    实际上,用树的后序遍历就可以了。当访问到所求的节点A时,如果这两个节点不在一条线上,则它们必定分别在A的左子树和右子树上,后序遍历到第一个满足这个条件的节点就是所要求的节点A。另外,还必须对这两个节点在一条线上的情况,做特殊处理。

代码:
static  bool  lca(Node  * root,  int  va,  int  vb, Node  *& result, Node *  parrent)
{
  
// left/right 左/右子树是否含有要判断的两节点之一 
  bool left = false, right = false;
  
if (!result && root->left) left = lca(root->left,va,vb,result,root);
  
if (!result && root->right) right = lca(root->right,va,vb,result,root);
  
// mid 当前节点是否是要判断的两节点之一 
  bool mid = false;
  
if (root->data == va || root->data == vb) mid=true;
  
if (!result && int(left + right + mid) == 2{
    
if (mid) result = parrent;
    
else result = root;
  }

  
return left | mid | right ;
}


Node 
* lca(Node  * root, int  va,  int  vb)
{
  
if (root == NULL) return NULL;
  Node 
*result = NULL;
  lca(root, va, vb,result, NULL);
  
return result;
}


作者:  flyinghearts 
出处:  http://www.cnblogs.com/flyinghearts/ 
本文采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值