【面试题】剑指Offer-50-求两个节点的最近公共祖先

题目概述

一颗二叉树,给出两个节点,求这两个节点的公共的祖先节点(要求的是离他们是最近的)


比如,6和8的公共节点为1,4,但是最近公共节点为4

解题思路

假设我们求6和8两个节点的公共祖先

我们可以遍历一遍二叉树,求出6和8分别的路径

6的路径Path1为1,4,5,6

8的路径Path2为1,4,8

这里我们用栈来保存该路径

这里比较Path1和Path2的大小

由于Path1比Path2的size大1

所以让Path1先出栈一个元素,结果为1,4,5

然后让Path1和Path2同时出栈,当他们的栈顶元素相同时

就是最近的公共祖先了

代码实现

//查找一个节点的路径
//可以转换成节点指针
bool FindPath(BTNode* root, int data, stack<int>& Path)
{
	if (root == NULL)
		return false;

	Path.push(root->data);
	if (root->data == data)
		return true;

	if (FindPath(root->left, data, Path))
		return true;

	if (FindPath(root->right, data, Path))
		return true;

	Path.pop();
	return false;
}

//认为x1,x2已经存在于root树中
//int TheCommonNode(BTNode* root, BTNode* x1, BTNode* x2)
//可以传指针,可以传数据,但是要保证数据不重复
int TheCommonNode(BTNode* root, int x1, int x2)
{
	if (root == NULL)
		return NULL;

	assert(x1);
	assert(x2);

	stack<int> s1;
	stack<int> s2;

	/*FindPath(root, x1->data, s1);
	FindPath(root, x2->data, s2);*/

	FindPath(root, x1, s1);
	FindPath(root, x2, s2);

	int Size1 = s1.size();
	int Size2 = s2.size();

	if (Size1 > Size2)
	{
		int tmp = Size1 - Size2;
		while (tmp--)
			s1.pop();
	}
	if (Size1 < Size2)
	{
		int tmp = Size2 - Size1;
		while (tmp--)
			s2.pop();
	}

	while (1)
	{
		if (s1.top() == s2.top())
			return s1.top();

		s1.pop();
		s2.pop();
	}

	assert(false);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值