非常重要的小细节!
在C++类中vector声明,报错 “expected parameter declarator”_c++ vector报错-CSDN博客
1.(没有深度思考)能通过5/10,原因:内存受限。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
// 不能是bool型,还得是返回vector型
// 因为当递归返回后,path的元素会减少的,不像全局变量那样只push_back
vector getPath(TreeNode* root, int target, vector path) {
path.push_back(root->val);
vector a;
if (root == NULL)
return a;
if (root->val == target)
return path;
if (root->left != NULL){
a = getPath(root->left, target, path);
if (!a.empty())
return a;
}
if (root->right != NULL)
a = getPath(root->right, target, path);
return a;
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
vector path1; // 声明了一个int数组,大小没有指定
vector path2;
path1 = getPath(root, o1, path1);
path2 = getPath(root, o2, path2);
int res;
for (int i = 0; i < path1.size() && i < path2.size(); i++) {
if (path1[i] == path2[i])
res = path1[i];
else
break;
}
return res;
}
};
疑问:①必须得返回,不能写成:
getPath(root->left, target, path);
getPath(root->right, target, path);
②必须判断左右节点是否为空,不能写成:
a = getPath(root->left, target, path);
if (!a.empty())
return a;
a = getPath(root->right, target, path);
return a;
2.主要思想是用到全局变量。(主要是忘记dfs的模板了,即忘记了&的作用)
有一些编程细节,放在注释里面了。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
// vector flag={0,0}; // vector flag(2)为什么不行?
int flag1 = 0;
int flag2 = 0;
vector path1;
vector path2;
void getPath1(TreeNode* root, int target) {
if (root == NULL)
return;
if (root->val == target) {
flag1 = 1;
path1.push_back(root->val);
return;
}
if (flag1 == 0)
getPath1(root->left, target);
if (flag1 == 0)
getPath1(root->right, target);
if (flag1 == 1)
path1.push_back(root->val);
return;
}
void getPath2(TreeNode* root, int target) {
if (root == NULL)
return;
if (root->val == target) {
flag2 = 1;
path2.push_back(root->val);
return;
}
if (flag2 == 0)
getPath2(root->left, target);
if (flag2 == 0)
getPath2(root->right, target);
if (flag2 == 1)
path2.push_back(root->val);
return;
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
getPath1(root, o1);
getPath2(root, o2);
int res;
// 这种方法不可以,path必须顺着来,不能逆着来。
// for (int i = 0; i < path1.size() && i < path2.size(); i++) {
// if (path1[i] == path2[i]){
// res = path1[i];
// break;
// }
// }
reverse(path1.begin(), path1.end());
reverse(path2.begin(), path2.end());
for (int i = 0; i < path1.size() && i < path2.size(); i++) {
if (path1[i] == path2[i])
res = path1[i];
else
break;
}
return res; //必须在最后要return一下,不能只在for循环里return。
}
};
回溯!忘记了。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
// vector flag={0,0}; // vector flag(2)为什么不行?
int flag = 0;
void getPath(TreeNode* root, int target, vector& path) {
//忘记&的作用了
if (flag == 1)
return;
if (root == NULL)
return;
path.push_back(root->val);
if (root->val == target) {
flag = 1;
return;
}
getPath(root->left, target, path);
getPath(root->right, target, path);
if(flag == 1) // 找到了,就不需要pop
return;
path.pop_back();
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
vector path1, path2;
getPath(root, o1, path1);
flag = 0;
getPath(root, o2, path2);
int res;
for (int i = 0; i < path1.size() && i < path2.size(); i++) {
if (path1[i] == path2[i])
res = path1[i];
else
break;
}
return res;
}
};