最近公共父节点(即LCA问题)的一点思路
2012-10-12 19:36
344 查看
这个面试题可以说是众多面试官喜欢出的题目,自己写一下自己思路和代码,希望抛砖引玉,如果有错误请指正。
对于知道parent结点的部分,不做解析,值考虑已知root结点,lChild和rChild;
问题:找到二叉树中p1和p2的最近公共父节点。
另外一种解法:就是把根节点到p1,p2的路径存储起来,然后比较。
bool FindNodePath(BTNode *b, BTNode *p, list<BTNode *> &path)
{
if (b == p)
{
return true;
}
path.push_back(b);
bool isFind = false;
if (b->lchild != NULL)
{
isFind = FindNodePath(b->lchild, p, path);
}
if(!isFind && b->rchild)
{
isFind = FindNodePath(b->rchild, p, path);
}
if(!isFind)
path.pop_back();
return isFind;
}
BTNode *NearParentNode(list<BTNode *>&path1,list<BTNode *>&path2)
{
BTNode *LCA;
list<BTNode *>::const_iterator i1 = path1.begin();
list<BTNode *>::const_iterator i2 = path2.begin();
for (i1;i1 != path1.end();i1++)
{
for (i2;i2 != path2.end();i2++)
{
if (*i1 == *i2)
{
LCA = *i1;
}
}
}
return LCA;
}
BTNode *NearestParentNode(BTNode *b, BTNode *p1, BTNode *p2)
{
if (b == NULL || p1 == NULL || p2 == NULL)
{
return NULL;
}
list<BTNode *> path1;
list<BTNode *> path2;
FindNodePath(b, p1, path1);
FindNodePath(b, p2, path2);
return NearParentNode(path1, path2);
}
对于知道parent结点的部分,不做解析,值考虑已知root结点,lChild和rChild;
问题:找到二叉树中p1和p2的最近公共父节点。
//LCA问题 BTNode *FindNearestParentNode(BTNode *b, BTNode *p1, BTNode *p2) { if (NULL == b) { return NULL; } if(b == p1 || b == p2) { return b; } BTNode *lFind = FindNearestParentNode(b->lchild, p1, p2); BTNode *rFind = FindNearestParentNode(b->rchild, p1, p2); if(lFind && rFind) return b; return lFind ? lFind : rFind; }
另外一种解法:就是把根节点到p1,p2的路径存储起来,然后比较。
bool FindNodePath(BTNode *b, BTNode *p, list<BTNode *> &path)
{
if (b == p)
{
return true;
}
path.push_back(b);
bool isFind = false;
if (b->lchild != NULL)
{
isFind = FindNodePath(b->lchild, p, path);
}
if(!isFind && b->rchild)
{
isFind = FindNodePath(b->rchild, p, path);
}
if(!isFind)
path.pop_back();
return isFind;
}
BTNode *NearParentNode(list<BTNode *>&path1,list<BTNode *>&path2)
{
BTNode *LCA;
list<BTNode *>::const_iterator i1 = path1.begin();
list<BTNode *>::const_iterator i2 = path2.begin();
for (i1;i1 != path1.end();i1++)
{
for (i2;i2 != path2.end();i2++)
{
if (*i1 == *i2)
{
LCA = *i1;
}
}
}
return LCA;
}
BTNode *NearestParentNode(BTNode *b, BTNode *p1, BTNode *p2)
{
if (b == NULL || p1 == NULL || p2 == NULL)
{
return NULL;
}
list<BTNode *> path1;
list<BTNode *> path2;
FindNodePath(b, p1, path1);
FindNodePath(b, p2, path2);
return NearParentNode(path1, path2);
}
相关文章推荐
- LCA问题:求二叉树中任意两个节点的最近公共祖先
- 两个节点最近公共祖先问题(LCA问题)极客
- 1 数据结构类-最近公共祖先LCA问题
- 最近公共祖先(Least Common Ancestors,LCA)问题详解
- 最近公共祖先(LCA)和RMQ问题
- 最近公共祖先LCA问题
- 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)
- 最近公共祖先--LCA问题
- 1 数据结构类-最近公共祖先LCA问题
- 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)
- LCA问题(最近公共祖先问题)+ RMQ问题
- LCA(最近公共祖先)问题的新老解法对比
- poj 1330 【最近公共祖先问题+fa[]数组+ 节点层次搜索标记】
- 1 数据结构类-最近公共祖先LCA问题
- LCA问题(最近公共祖先问题)+ RMQ问题
- LCA(最近公共祖先)问题的离线算法
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
- 1 数据结构类-最近公共祖先LCA问题
- 图论--最近公共祖先问题(LCA)模板
- LCA(最近公共祖先)问题 (一)