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

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

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

递归的思路要能想到,然后就是深度优先搜索后获得公共的祖先,注意祖先包括自身, 真祖先才不包括自己,概念需要复习一下

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
#include <stack>
class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    void traverse(TreeNode* node, int o1, int o2, vector<int>& temp, vector<vector<int>>& res){
        temp.push_back(node->val);
        if(node->val == o1 or node->val == o2){
            vector<int>* t = new vector<int>(temp);
            res.push_back(*t);
            if(res.size() == 2){
                return ;
            }
        }
        
        if(node->left != NULL){
            traverse(node->left, o1, o2, temp, res);
        }
        if(node->right != NULL){
            traverse(node->right, o1, o2, temp, res);
        }
        temp.pop_back();
    }
    int recursion(TreeNode* root, int o1, int o2){
        int res = -1;
        if(root == NULL)
            return res;
        if(root->val == o1 or root->val == o2)
            res = root->val;
        int l = recursion(root->left, o1, o2);
        int r = recursion(root->right, o1 , o2);
        if(res != -1)
            return res;
        else{
            if(l != -1 and r != -1)
                return root->val;
            else if(l != -1)
                return l;
            else
                return r;
        }
    }
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        vector<int> temp;
        vector<vector<int>> res;
//         traverse(root, o1, o2, temp, res);
//         assert(res.size() == 2);
//         vector<int> res1 = res[0];
//         vector<int> res2 = res[1];
//         int r = -1;
//         for(int i = res1.size() - 1; i >= 0; i--){
//             int val = res1[i];
//             for(int j = res2.size() - 1; j >= 0; j--){
//                 if(res2[j] == val){
//                     r = val;
//                     break;
//                 }
//             }
//             if(r != -1){
//                 break;
//             }
//         }
//         return r;
        return recursion(root, o1, o2);
    }
};
全部评论

相关推荐

祈求顺利毕业😁:简历很好了,多投吧牛油😂。主要是环境不好,大家也卷
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务