二叉树两个结点的最低共同父结点(树)

41 篇文章 1 订阅

题目:二叉树的结点定义如下:

struct TreeNode

{

   int m_nvalue;

   TreeNode* m_pLeft;

   TreeNode* m_pRight;

};

输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。


解法:

要想找到两个节点的最低共同父结点,其实就是找一个节点,使得它的左子树包含两个结点中的一个结点,右子树包含另外一个节点。该算法的C代码可以写成如下:

Node * pResult = null;
int GetChildNode(Node * pRoot, Node * node_1, Node * node_2)
{
	if (null != pResult) return 0;
	int sum = 0;
	if (null == pRoot)return sum;
	if (pRoot == node_1)sum += 1;
	if (pRoot == node_2)sum += 1;
	sum += GetChildNode(pRoot->m_pLeft, node_1, node_2);
	sum += GetChildNode(pRoot->m_pRight, node_1, node_2);
	if (2 == sum && null == pResult)
	{
		pResult = pRoot;
		return 0;
	}
	return sum;
}
如果左子树包含其中一个结点,则将结点的值+1, 同样右子树包含其中一个结点,也将该结点的权重+1,第一个权重为2的结点就是我们要找的最低公共结点。

此算法采用后序遍历的方式。这里考虑了两个节点值相同的情况和一个节点是另一个结点的父结点的情况。


此算法可以很容易拓展到K个节点的最低共同父结点的问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值