019写程序在一棵二叉树中找到两个结点的最近共同祖先(keep it up)
2014-09-07 01:54
471 查看
写程序在一棵二叉树中找到两个结点的最近共同祖先。
分两种情况来讨论这个题:
第一种情况结点中没有指向父结点的指针
第二种情况接种有指向父节点的指针
我们先看第一种情况,结点中没有指向父结点的指针。
我们可以采用暴力搜索每一个结点,如果这个结点的子树中
有已知的两个结点,那我们就继续沿着左右子树找,如果左子树
能找到,我们就继续沿着左子树找,如果有子树能找到,我们就
沿着右子树找,不存在两个子树都能够找到。
代码:
struct STreeNode
{
int Data;
STreeNode *pLChild;
STreeNode *pRChild;
};
bool isFather(STreeNode *vRoot, STreeNode *vSubNode)
{
if (vRoot == NULL) return false;
else (if vRoot == vSubNode) return true;
bool Temp = isFather(vRoot->pLChild, vSubNode);
if (!Temp)
{
Temp = isFather(vRoot->pRChild, vSubNode);
}
return Temp;
}
void findNearestAncestor(STreeNode *vRoot, STreeNode *vNodeA, STreeNode *vNodeB, STreeNode *&voAns)
{
if (vRoot == NULL || vNodeA == NULL || vNodeB == NULL) return;
bool FindRes = isFather(vRoot, vNodeA) && isFather(vRoot, vNodeB);
if (FindRes)
{
voAns = vRoot;
findNearestAncestor(vRoot->pLChild, vNodeA, vNodeB, voAns);
findNearestAncestor(vRoot->pRChild, vNodeA, vNodeB, voAns);
}
}
int main()
{
return 0;
}
在看第二种情况比较简单,如果有指向父结点的指针,我们可以搜索第一个结点的
父节点,然后判断是不是第二个已知结点的父结点。
代码:
分两种情况来讨论这个题:
第一种情况结点中没有指向父结点的指针
第二种情况接种有指向父节点的指针
我们先看第一种情况,结点中没有指向父结点的指针。
我们可以采用暴力搜索每一个结点,如果这个结点的子树中
有已知的两个结点,那我们就继续沿着左右子树找,如果左子树
能找到,我们就继续沿着左子树找,如果有子树能找到,我们就
沿着右子树找,不存在两个子树都能够找到。
代码:
struct STreeNode
{
int Data;
STreeNode *pLChild;
STreeNode *pRChild;
};
bool isFather(STreeNode *vRoot, STreeNode *vSubNode)
{
if (vRoot == NULL) return false;
else (if vRoot == vSubNode) return true;
bool Temp = isFather(vRoot->pLChild, vSubNode);
if (!Temp)
{
Temp = isFather(vRoot->pRChild, vSubNode);
}
return Temp;
}
void findNearestAncestor(STreeNode *vRoot, STreeNode *vNodeA, STreeNode *vNodeB, STreeNode *&voAns)
{
if (vRoot == NULL || vNodeA == NULL || vNodeB == NULL) return;
bool FindRes = isFather(vRoot, vNodeA) && isFather(vRoot, vNodeB);
if (FindRes)
{
voAns = vRoot;
findNearestAncestor(vRoot->pLChild, vNodeA, vNodeB, voAns);
findNearestAncestor(vRoot->pRChild, vNodeA, vNodeB, voAns);
}
}
int main()
{
return 0;
}
在看第二种情况比较简单,如果有指向父结点的指针,我们可以搜索第一个结点的
父节点,然后判断是不是第二个已知结点的父结点。
代码:
struct TreeNode { int data; TreeNode* leftChild; TreeNode* rightChild; TreeNode* parent; }; //用父结点 bool findNearestAncestor2(const TreeNode* vNodeA, const TreeNode* vNodeB, TreeNode *vAncestor) { if (isFather(vNodeA, vNodeB)) { vAncestor = vNodeA; return true; } if (isFather(vNodeB, vNodeA)) { vAncestor = vNodeB; return true; } TreeNode* Parent = vNodeA->parent; while (true) { if (isFather(Parent, vNodeB)) { vAncestor = Parent; return true; } Parent = Parent->parent; } return false; }
相关文章推荐
- 利用栈,求以二叉链表表示的二叉树中的两个结点的最近共同祖先
- 求二叉树任意两个结点最近的共同祖先
- (016)给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树(keep it up)
- Q4.6 找到两个结点的第一个共同祖先
- 【题目23】找出二叉树上任意两个结点的最近共同父结点
- 二叉树------寻找二叉树中两个结点的最近公共祖先
- 找出二叉树上任意两个结点的最近共同父结点。
- 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
- 在二叉树中找到两个节点的最近公共祖先
- 面试题: 找出二叉树上任意两个结点的最近共同父结点。
- 二叉树中找两个结点的最近公共祖先结点
- 给出一棵二叉树的根节点和其中两个不同的节点求出它们最近的公共祖先节点
- 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
- 利用栈结构实现二叉树的非递归遍历,求二叉树深度、叶子节点数、两个结点的最近公共祖先及二叉树结点的最大距离
- 通过邻接矩阵找到两个节点的最近公共祖先结点
- 求二叉树中任意两结点的最近共同祖先的算法及其证明
- 查找二叉树某两个节点最近的共同祖先及改进方法
- 13、设计一个算法,找出二叉树上任意两个结点的最近共同父结点。
- 二叉树两个结点的第一个共同祖先
- 程序员面试金典: 9.4树与图 4.7找出二叉树种某两个结点的第一个共同祖先---O(N^2)解法