思路1:我们使用DFS遍历整棵树,并且记录每一个结点,如果遍历到根也没找到目标o1,则进行删除处理(我们使用&vector对数组进行实时记录);因为需要手动删除,使用需要设置flag来标识,以免删除o1,o2;最后的路径的大小有三种情况,size1 = size2(直接取前一个数值即可),size1 < size2,size1 > szie2,大于小于这两类取长度小的最后一个数据即可
注意:此处需要用引用;我自己不想手动删除,所以就新开一个引用的数组,当找到o1或者o2时直接将路径复制到新开的数组中,然后内存超限qvq
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
void DFS(TreeNode* root, vector<int>& myvector, int o1, bool& flag)
{
if(root)
{
myvector.push_back(root->val);
if(root->val==o1)
{
flag=true;
return;
}
DFS(root->left, myvector, o1, flag);
DFS(root->right, myvector, o1, flag);
if(flag)
return;
myvector.pop_back();
}
return;
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
vector<int> myvector1, myvector2;
bool flag1=false;
bool flag2=false;
DFS(root, myvector1, o1, flag1);
DFS(root, myvector2, o2, flag2);
int size1=myvector1.size();
int size2=myvector2.size();
int len=min(size1, size2);
for(int i=1;i<len;i++)
{
if(myvector1[i]!=myvector2[i])
return myvector1[i-1];
}
if(size1>size2)
return myvector2[size2-1];
else
return myvector1[size1-1];
}
};