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

image
image
image


class Solution {
public:

    //用来判断是否找到节点
    bool flag = false;
    //dfs遍历得到路径,递归遍历,也就是先序遍历根左右
    //传入参数:节点,容器,要找的值
    void dfs(TreeNode* root, vector<int> & path, int o)
    {
        //判断根节点的值是否是要找的那个,或者是叶子节点
        if(flag || root == NULL)
            return ;

        //将根节点加入容器,判断根节点是否是要找的那个节点,然后遍历左右子树
        path.push_back(root->val);

        if(root->val == o)
        {
            flag = true;
            return ;
        }
           
        dfs(root->left, path, o);
        dfs(root->right, path, o);

        //如果找到那个节点,就返回,如果没有找到就回溯,将最后加入的那个节点从容其中删除
        if(flag)
            return ;

        path.pop_back();
    }

    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        //思路:利用dfs遍历找到两个节点的路径,然后比较路径
        //找到最后一个相同的节点值即是最近的公共祖先

        //用vector容器来存储路径
        vector<int> path1, path2;

        //dfs遍历得到路径
        dfs(root,path1,o1);

        flag = false;
        dfs(root,path2,o2);

        int res; //res用来接收最近公共祖先

        //遍历两个路径,找到最后一个相同的节点值
        for(int i = 0; i < path1.size() && i < path2.size(); i++)
        {
            if(path1[i] == path2[i])
                res = path1[i];
            else
                break;
        }
        return res;
    }
};
posted @ 2024-04-20 21:36  蓝色的海嗷  阅读(49)  评论(0)    收藏  举报