您的位置:首页 > 理论基础 > 数据结构算法

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 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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐