二叉树中找到两结点的共同祖先(递归)

从根节点往左右子树遍历过程中,对于一个最近共同祖先的情况如下(两结点存在的情况下):
1、当前结点就是两结点之一,另一个在当前结点的子树上。
2、一个在左、一个在右。

可以考虑递归:

//res存放结果
bool findanc(BitTree bt,BitTree p, BitTree q, BitTree &res) {
	if(bt){
		
		if( bt == p && (findanc(bt->lchild) || findanc(bt->rchild)) ) { //情况1
			res = bt;
			return true; 
			}
		if( bt == q && (findanc(bt->lchild) || findanc(bt->rchild)) ) { //情况3 
			res = bt;
			return true; 
			}
		else if(bt == q || bt == p) return true;  //当前是其一,但左右没有另一个 
		if (findanc(bt->lchild) && findanc(bt->rchild)) { //左子树有一个,右子树有一个 ,情况2
			res = bt;
			return true;
		}
			return (findanc(bt->lchild) || findanc(bt->rchild);  //左子树或右子树有,这棵树就有。 
	} 
	
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值