这个题考的是二叉树的遍历,节点路径的计算方式,需要回溯。
剩下的就比较简单了,就是找两个路径最后一个相同的值,就是公共祖先了。
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    vector<int> path;
    vector<int> path1;
    vector<int> path2;
    
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        if(root == NULL){
            return -1;
        }
        int res = root->val;
        // write code here
        findPath(root, o1,o2);
        for(int i=0;i<path1.size() && i < path2.size();i++){
            if(path1[i] == path2[i]){
                res = path1[i];
            }else{
                break;
            }
        }
        
        return res;
    }
    
    void findPath(TreeNode* root, int o1, int o2){
        if(root == NULL){
            return;
        }
        
        path.push_back(root->val);
        if(root->val == o1){
            path1 = path;
        }else if(root->val == o2){
            path2 = path;
        }
        
        if(!path1.empty() && !path2.empty()){
            return;
        }
        
        if(root->left != NULL){
            findPath(root->left, o1, o2);
            path.pop_back();
        }
        if(root->right != NULL){
            findPath(root->right, o1, o2);
            path.pop_back();
        }
    }
};