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

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

http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116

非递归方式--深度优先搜索
思路很简单,深度搜索出所有路径,搜索的过程中过滤出到达o1和o2的路径保存,最后找到o1和o2的路径上的公共节点

map<TreeNode, bool> m; 记录哪个节点访问过
deque<TreeNode
> dq; 用于保存深度搜索路径
vector<deque<TreeNode*>> res; 用于保存搜索到o1或者o2时的路径

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        return dfs(root, o1, o2);
    }
    int dfs(TreeNode* root, int o1, int o2) {
        vector<deque<TreeNode*>> res;
        map<TreeNode*, bool> m;
        deque<TreeNode*> dq;
        dq.push_back(root);
        m[root] = true;
        while (!dq.empty()) {
            TreeNode* cur = dq.back();
            if (cur->left && m.find(cur->left) == m.end()) {
                dq.push_back(cur->left);
                m[cur->left] = true;
                if (cur->left->val == o1 || cur->left->val == o2)
                    res.push_back(dq);
                continue;
            }
            if (cur->right && m.find(cur->right) == m.end()) {
                dq.push_back(cur->right);
                m[cur->right] = true;
                if (cur->right->val == o1 || cur->right->val == o2)
                    res.push_back(dq);
                continue;
            }
            //回溯
            do  {
                dq.pop_back();
                if(!dq.empty())
                    cur = dq.back();
            } while (!dq.empty()&&
                m.find(cur->left)!= m.end()&&
                m.find(cur->right) != m.end());
        }
        //获取公共节点
        TreeNode* end_res = nullptr;
        while (res[0].front() == res[1].front()) {
            end_res = res[0].front();
            res[0].pop_front();
            res[1].pop_front();
        }
        return end_res->val;
    }
};
全部评论

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务