题目概述
一颗二叉树,给出两个节点,求这两个节点的公共的祖先节点(要求的是离他们是最近的)
比如,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);
}