• 【打卡】牛客网:BM38 在二叉树中找到两个节点的最近公共祖先


    资料:

    非常重要的小细节! 

    在C++类中vector声明,报错 “expected parameter declarator”_c++ vector报错-CSDN博客

    自己写的:

    1.(没有深度思考)能通过5/10,原因:内存受限。

    1. /**
    2. * struct TreeNode {
    3. * int val;
    4. * struct TreeNode *left;
    5. * struct TreeNode *right;
    6. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. /**
    12. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    13. *
    14. *
    15. * @param root TreeNode类
    16. * @param o1 int整型
    17. * @param o2 int整型
    18. * @return int整型
    19. */
    20. // 不能是bool型,还得是返回vector
    21. // 因为当递归返回后,path的元素会减少的,不像全局变量那样只push_back
    22. vector<int> getPath(TreeNode* root, int target, vector<int> path) {
    23. path.push_back(root->val);
    24. vector<int> a;
    25. if (root == NULL)
    26. return a;
    27. if (root->val == target)
    28. return path;
    29. if (root->left != NULL){
    30. a = getPath(root->left, target, path);
    31. if (!a.empty())
    32. return a;
    33. }
    34. if (root->right != NULL)
    35. a = getPath(root->right, target, path);
    36. return a;
    37. }
    38. int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
    39. // write code here
    40. vector<int> path1; // 声明了一个int数组,大小没有指定
    41. vector<int> path2;
    42. path1 = getPath(root, o1, path1);
    43. path2 = getPath(root, o2, path2);
    44. int res;
    45. for (int i = 0; i < path1.size() && i < path2.size(); i++) {
    46. if (path1[i] == path2[i])
    47. res = path1[i];
    48. else
    49. break;
    50. }
    51. return res;
    52. }
    53. };

    疑问:①必须得返回,不能写成:

    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的模板了,即忘记了&的作用)

    有一些编程细节,放在注释里面了。

    1. /**
    2. * struct TreeNode {
    3. * int val;
    4. * struct TreeNode *left;
    5. * struct TreeNode *right;
    6. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. /**
    12. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    13. *
    14. *
    15. * @param root TreeNode类
    16. * @param o1 int整型
    17. * @param o2 int整型
    18. * @return int整型
    19. */
    20. // vector flag={0,0}; // vector flag(2)为什么不行?
    21. int flag1 = 0;
    22. int flag2 = 0;
    23. vector<int> path1;
    24. vector<int> path2;
    25. void getPath1(TreeNode* root, int target) {
    26. if (root == NULL)
    27. return;
    28. if (root->val == target) {
    29. flag1 = 1;
    30. path1.push_back(root->val);
    31. return;
    32. }
    33. if (flag1 == 0)
    34. getPath1(root->left, target);
    35. if (flag1 == 0)
    36. getPath1(root->right, target);
    37. if (flag1 == 1)
    38. path1.push_back(root->val);
    39. return;
    40. }
    41. void getPath2(TreeNode* root, int target) {
    42. if (root == NULL)
    43. return;
    44. if (root->val == target) {
    45. flag2 = 1;
    46. path2.push_back(root->val);
    47. return;
    48. }
    49. if (flag2 == 0)
    50. getPath2(root->left, target);
    51. if (flag2 == 0)
    52. getPath2(root->right, target);
    53. if (flag2 == 1)
    54. path2.push_back(root->val);
    55. return;
    56. }
    57. int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
    58. // write code here
    59. getPath1(root, o1);
    60. getPath2(root, o2);
    61. int res;
    62. // 这种方法不可以,path必须顺着来,不能逆着来。
    63. // for (int i = 0; i < path1.size() && i < path2.size(); i++) {
    64. // if (path1[i] == path2[i]){
    65. // res = path1[i];
    66. // break;
    67. // }
    68. // }
    69. reverse(path1.begin(), path1.end());
    70. reverse(path2.begin(), path2.end());
    71. for (int i = 0; i < path1.size() && i < path2.size(); i++) {
    72. if (path1[i] == path2[i])
    73. res = path1[i];
    74. else
    75. break;
    76. }
    77. return res; //必须在最后要return一下,不能只在for循环里return。
    78. }
    79. };

    模板的:

    回溯!忘记了。

    1. /**
    2. * struct TreeNode {
    3. * int val;
    4. * struct TreeNode *left;
    5. * struct TreeNode *right;
    6. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. /**
    12. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    13. *
    14. *
    15. * @param root TreeNode类
    16. * @param o1 int整型
    17. * @param o2 int整型
    18. * @return int整型
    19. */
    20. // vector flag={0,0}; // vector flag(2)为什么不行?
    21. int flag = 0;
    22. void getPath(TreeNode* root, int target, vector<int>& path) {
    23. //忘记&的作用了
    24. if (flag == 1)
    25. return;
    26. if (root == NULL)
    27. return;
    28. path.push_back(root->val);
    29. if (root->val == target) {
    30. flag = 1;
    31. return;
    32. }
    33. getPath(root->left, target, path);
    34. getPath(root->right, target, path);
    35. if(flag == 1) // 找到了,就不需要pop
    36. return;
    37. path.pop_back();
    38. }
    39. int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
    40. // write code here
    41. vector<int> path1, path2;
    42. getPath(root, o1, path1);
    43. flag = 0;
    44. getPath(root, o2, path2);
    45. int res;
    46. for (int i = 0; i < path1.size() && i < path2.size(); i++) {
    47. if (path1[i] == path2[i])
    48. res = path1[i];
    49. else
    50. break;
    51. }
    52. return res;
    53. }
    54. };

  • 相关阅读:
    从源码分析 MGR 的流控机制
    ssm+vue+elementUI 基于微信小程序的电动电动汽车车智能充电桩服务平台-#毕业设计
    【safetensor】Debug
    FifoBuffer函数库详解
    代理的匿名级别有哪些?为什么匿名性很重要?
    IntelliJ IDEA远程调试:使用IDEA Remote Debug进行高效调试的指南
    CopyOnWriteArrayList源码分析
    计算机网络-数据交换技术
    Java使用Excel的问题:自动跳过空字段、中文加拼音和时间处理错误的解决方法
    Spring Security内部工作原理
  • 原文地址:https://blog.csdn.net/weixin_47173826/article/details/134292349