实现思路
先求出到达两个结点分别的路径,将路径存储起来
实现代码
自己实现的代码一:(超出内存限制)
实现代码
/**
* 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 search(TreeNode *root,TreeNode*p,TreeNode *q,vector<vector<TreeNode*>> &data,vector<TreeNode*> path){
if(!root) return;
path.push_back(root);
if(root==q||root==p){
data.push_back(path);
}
search(root->left,p,q,data,path);
search(root->right,p,q,data,path);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<vector<TreeNode*>> data;
TreeNode *re=NULL;
vector<TreeNode*> path;
search(root,p,q,data,path);
int i=0,j=0;
int n=min(data[0].size(),data[1].size());
for(int i=0;i<n;i++){
if(data[0][i]==data[1][i]){
re=data[0][i];
}else{
break;
}
}
return re;
}
};
自己实现的代码二:
/**
* 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 search(TreeNode *root,TreeNode*p,TreeNode *q,vector<vector<TreeNode*>> &data,vector<TreeNode*> &path){
if(!root) return;
path.push_back(root);
if(root==q||root==p){
data.push_back(path);
}
search(root->left,p,q,data,path);
search(root->right,p,q,data,path);
path.pop_back();
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<vector<TreeNode*>> data;
TreeNode *re=NULL;
vector<TreeNode*> path;
search(root,p,q,data,path);
int i=0,j=0;
int n=min(data[0].size(),data[1].size());
// cout<<"ok"<<endl;
for(int i=0;i<n;i++){
if(data[0][i]==data[1][i]){
re=data[0][i];
}else{
break;
}
}
return re;
}
};
提交结果及分析
时间复杂度应该为遍历树的时间O(n)
总结
全局变量的使用
全局变量在使用的过程中,一般是多线程的时候需要使用全局变量,只是一个单线程的时候尽量避免使用全局变量
深度优先搜索代码框架
前序:没访问之前的操作
中序:正在访问时的操作
后续:访问之后的操作
引用变量的使用
在遍历路径时,最原先我在代码中传递的path是一个临时的变量,也就意味着每一次在递归的时候需要开辟新的空间,在提交的时候出现的是时间超时,后来我在执行测试的时候发现报的错误是内存超出了限制。
我将代码进行了修改,将path这一记录遍历过程中路径的参数改为了引用,也就意味着所有递归函数中使用的实际上都是一个变量的空间,由于改成了引用,所以要记得在遍历左右子树之后要最新加入的节点弹出