[C++] LeetCode 236. 二叉树的最近公共祖先

题目

给定一棵二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义: “对于有根树T的两个结点uv,最近公共祖先表示一个结点x,满足xuv的祖先且x的深度尽可能大。”(一个节点也可以是它自己的祖先)
这里写图片描述
例如,节点5和节点1的最近公共祖先是节点3;节点5和节点4的最近公共祖先是节点5,因为根据定义,一个节点可以是它自己的祖先。

题解

这道题应该是面试常考题。可以考虑直接用两个数组分别记录uv的路径,然后遍历两个路径找公共祖先

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool getAncestor(TreeNode* root,TreeNode *p,vector<TreeNode*> &vec){
        if(root==NULL) return false;
        if(root==p){
            vec.push_back(root);
            return true;
        }
        if(getAncestor(root->left,p,vec)||getAncestor(root->right,p,vec)){
            vec.push_back(root);
            return true;
        }
        return false;

    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        vector<TreeNode*> vp,vq;
        getAncestor(root,p,vp);
        getAncestor(root,q,vq);
        int n=vp.size(),m=vq.size();
        while(n>0&&m>0&&vp[n-1]==vq[m-1]){
            n--;
            m--;
        }
        return vp[n];
    }
};

猜你喜欢

转载自blog.csdn.net/lv1224/article/details/80049164