题解 | #在二叉树中找到两个节点的最近公共祖先#

在二叉树中找到两个节点的最近公共祖先

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; //如果遍历到根节点,根节点一定是公共节点,返回该根节点的值
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 16:22
点赞 评论 收藏
分享
06-07 17:17
嘉兴学院 教师
心爱的idea:你孩
点赞 评论 收藏
分享
一表renzha:手写数字识别就是一个作业而已
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务