LCA二叉树任意两节点的共同祖先

在一棵二叉树中任意指定两节点,求这两节点的最近共同祖先,即LCA问题。

 

后序遍历解法:

         Case 1::两节点没有血缘关系,即其中一节点不是另一节点的父辈或子辈,则它们必定在共同祖先的不同子树上。也就是说,如果一个节点的左子树能找到一节点,其右子树能找到另一个节点,则这个节点就是该两节点的共同祖先。

         Case 2:两节点有血缘关系,则返回深度较小的那个节点的父节点。

 

以下是算法代码,适用情况:二叉树中没有与指定节点相同的节点。

bool LCA(TNode * root,TNode * node1,TNode * node2,TNode * &restult,TNode * parent)
{
	if (!root)
	{
		return false;
	}

	//L查看左子树能否找到其中一个节点
	bool falg1=LCA(root->left,node1,node2,restult,root);

	//R查看右子树能否找到其中一个节点
	bool falg2=LCA(root->right,node1,node2,restult,root);

	if (falg1&&falg2) 
	{
		//左右子树各找到一个节点,则当前节点为两节点的最近共同祖先。
		restult=root;
		return true;
	}
 
	//D查看当前节点是否为其中一个节点
	if (root->data==node1->data||root->data==node2->data)
	{
		if (falg1||falg2)
		{
			//在左子树或右子树上已找到一个节点,当前节点为两节点中的另一个节点,当前子树的父节点为两节点的最近共同祖先。
			restult=parent;
		}
		//else: 代表当前节点的父节点的某一子树上找到了一个节点
		return true;
	}

	return falg1||falg2;
}

void LCA(TNode * root,TNode * node1,TNode * node2,TNode * &restult)
{
	LCA(root,node1,node2,restult,NULL);
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值