原题链接:二叉树的最近公共祖先
个人解法
思路:
这个题算一个经典的题目了,我的方法是dfs遍历到结点,将路径记下来,那么这里就有两条路径,最近的公共祖先只要求这两个序列的最后一个相等的值。
时间复杂度: O ( n ) O(n) O(n)
代码:
/**
* 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:
void dfs(vector<TreeNode*> &res, vector<TreeNode*> &tmp, TreeNode *root, TreeNode *p) {
if(root == NULL) return;
tmp.push_back(root);
if(root == p) {
res = tmp;
return;
}
dfs(res, tmp, root->left, p);
dfs(res, tmp, root->right, p);
tmp.pop_back();
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<TreeNode*> v1, v2, tmp;
dfs(v1, tmp, root, p);
tmp.clear();
dfs(v2, tmp, root, q);
int i, j;
for(i = 0,j = 0;(i + 1) < v1.size() && (j + 1) < v2.size();i ++, j ++) {
if(v1[i + 1]->val != v2[j + 1]->val) break;
}
return v1[i];
}
};