题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
1.将每个节点的父节点记录到字典kk中
2.找出o1和o2节点对应的指针
3.o1节点往上遍历到根节点,并将该路径所有节点的值存入集合path中
4.o2节点往上遍历到根节点,如果中途某个节点在path中,则直接返回该节点的值。
C++代码
void findkk(TreeNode* root, map<TreeNode*, TreeNode*>& kk) //记录每个节点的父节点,记录在字典kk中
{
auto left = root->left;
auto right = root->right;
if(left != NULL)
{
kk[left] = root;
findkk(left, kk);
}
if(right!=NULL)
{
kk[right] = root;
findkk(right, kk);
}
}
void findNode(TreeNode* root, int o1,int o2,vector<TreeNode*>& nodes)//找出这两个值对应节点的指针,nodes[0]是o1的节点指针,nodes[1]是o2的节点指针
{
if(root == NULL)
return;
if(root->val==o1)
nodes[0] = root;
else if(root->val==o2)
nodes[1] = root;
findNode(root->left, o1,o2,nodes);
findNode(root->right, o1,o2,nodes);
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2)
{
map<TreeNode*, TreeNode*> kk;
findkk(root, kk); //将每个节点的父节点存入字典kk
vector<TreeNode*> nodes;
nodes.resize(2, NULL);
findNode(root, o1, o2, nodes);//找出值为o1和o2的节点,并将其指针存入nodes
set<int> path; //将o1节点一直往上遍历,一直遍历的根节点,将这条路径上的节点指针存入集合path中
auto p1 = nodes[0];
while(p1 != root)
{
path.insert(p1->val);
p1 = kk[p1];
}
path.insert(root->val);
auto p2 = nodes[1]; //将o2节点一直往上遍历,每经过一个节点就判断这个节点是否在刚在o1节点经过的路径中,如果在就返回这个第一个公共节点的值
while(p2!=root)
{
if(path.find(p2->val) != path.end())
{
return p2->val;
}
else{
p2 = kk[p2];
}
}
return root->val; //如果遍历到根节点,根节点一定是公共节点,返回该根节点的值
}
查看11道真题和解析