我已经实现了 LCA 问题的解决方案。问题陈述是给定一棵二叉树,找到树中两个给定节点的最低共同祖先(LCA)。我使用的方法是找到从根到给定 2 个节点的路径,并将 2 个路径存储在一个向量中。从根开始比较两条路径中的节点(直到 LCA 应该匹配 p 和 q 的路径),所以在路径中发生不匹配之前的节点将是 LCA。
但是 Leetcode 仅通过了 29/31 个测试用例,对于非常大的输入超出了时间限制。这是代码:
/**
* 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:
vector<TreeNode*> path;
void pathUntilNode(TreeNode* root, vector<TreeNode*> res, TreeNode* p){
if(root==NULL) return;
res.push_back(root);
if(root==p){
path=res;
return ;
}
pathUntilNode(root->left, res, p);
pathUntilNode(root->right, res, p);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL) return NULL;
vector<TreeNode*> res;
pathUntilNode(root, res, p);
vector<TreeNode*> path1 = path;
pathUntilNode(root, res, q);
vector<TreeNode*> path2 = path;
int i;
for(i=0;i<min(path1.size(),path2.size());i++){
if(path1[i]!=path2[i])
return path1[i-1];
}
return path1[i-1];
}
};
据我所知,时间复杂度为 O(N)。不明白为什么我会得到 TLE。