树中两个结点的最低公共祖先

// 面试题68:树中两个结点的最低公共祖先
    // 题目:输入两个树结点,求它们的最低公共祖先。
    const std::shared_ptr<node_tree<int>> last_comm_parent(
            const std::shared_ptr<node_tree<int>>& root,
            const std::shared_ptr<node_tree<int>>& node1,
            const std::shared_ptr<node_tree<int>>& node2)
    {
        if(root == nullptr || node1 == nullptr || node2 == nullptr)
            return nullptr;

        std::list<const std::shared_ptr<node_tree<int>>> path1;
        _path(root, node1, path1);

        std::list<const std::shared_ptr<node_tree<int>>> path2;
        _path(root, node2, path2);

        auto it1 = path1.begin();
        auto it2 = path2.begin();

        std::shared_ptr<node_tree<int>> last = nullptr;
        while(it1 != path1.end() && it2 != path2.end())
        {
            if(*it1 == *it2)
                last = *it1;

            it1++;
            it2++;
        }

        return last;
    }

    bool _path(const std::shared_ptr<node_tree<int>>& root,
               const std::shared_ptr<node_tree<int>>& node,
               std::list<const std::shared_ptr<node_tree<int>>>& path)
    {
        path.push_back(root);

        if(root == node)
            return true;

        bool found = false;
        auto i = root->childs.begin();
        while(!found && i < root->childs.end())
        {
            found = _path(*i, node, path);
            ++i;
        }

        if(!found)
            path.pop_back();

        return found;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值