• 剑指offerDayN之请教大佬


    刷题看java已经小20天了,每天刷一点,递归还有debug一直都不会。

    找大佬指导,又被骂惨,感觉自己好像不适合写代码,逻辑思维差,简单的或与非都看不出来,脑子不好真的是有差距的,再次怀疑自己,但只能继续加油。

    在写代码的时候存在很严重的问题

    1. 写代码写一堆 没有逻辑 没有框架(要按照想法写注释 先写什么后写什么 逻辑顺序弄清楚)
    2. 递归出口  返回值   递归参数 这三个要好好思考
      1. package offer;
      2. import java.util.ArrayList;
      3. import java.util.List;
      4. import java.util.Stack;
      5. /*
      6. 二叉树中和为某一值的路径
      7. 递归出口 成立条件 不成立条件
      8. 递归参数 边写边添加
      9. */
      10. public class Test37 {
      11. public static List<List<Integer>> getDistanceK(TreeNode root, List<List<Integer>> list, int k, int sum, List<Integer> tempList) {
      12. if (root == null) return null;
      13. tempList.add(root.val);
      14. sum = sum + root.val;
      15. //无孩子
      16. if (root.left == null && root.right == null) {
      17. if (sum == k) {//是想要的
      18. list.add(tempList);
      19. }
      20. return list;
      21. } else if (root.left != null && root.right == null) {//有左孩子
      22. return getDistanceK(root.left, list, k, sum, tempList);
      23. } else if (root.left == null) {//只有右孩子
      24. return getDistanceK(root.right, list, k, sum, tempList);
      25. } else {//all
      26. getDistanceK(root.right, list, k, sum, new ArrayList<>(tempList));
      27. getDistanceK(root.left, list, k, sum, tempList);
      28. // return list;
      29. }
      30. //
      31. // List<Integer> temp = null;
      32. // while (root != null) {
      33. // sum += root.val;
      34. // temp.add(root.val);
      35. // if (sum == k) {
      36. // break;
      37. // } else if (root.left != null)
      38. // return getDistanceK(root.left,list, k);
      39. // else if (root.right != null)
      40. // return getDistanceK(root.right, list,k);
      41. // }
      42. // list.add(temp);
      43. return list;
      44. }
      45. //先序遍历 非递归
      46. public static void preOrder(TreeNode root) {
      47. if (root == null) return;
      48. //构建栈
      49. Stack<TreeNode> stack = new Stack<>();
      50. stack.push(root);
      51. while (!stack.isEmpty()) {
      52. TreeNode treeNode = stack.pop();
      53. System.out.print(treeNode.val);
      54. if (treeNode.right != null)
      55. stack.push(treeNode.right);
      56. if (treeNode.left != null)
      57. stack.push(treeNode.left);
      58. }
      59. }
      60. public static void main(String[] args) {
      61. TreeNode treeNode = new TreeNode(5);
      62. treeNode.left = new TreeNode(3);
      63. treeNode.left.left = new TreeNode(2);
      64. treeNode.left.right = new TreeNode(4);
      65. treeNode.right = new TreeNode(7);
      66. treeNode.right.left = new TreeNode(6);
      67. treeNode.right.right = new TreeNode(8);
      68. //先序遍历结果
      69. preOrder(treeNode);
      70. System.out.println();
      71. List<List<Integer>> list = new ArrayList<>();
      72. System.out.println(getDistanceK(treeNode, list, 10, 0, new ArrayList<>()));
      73. }
      74. }
      树的子结构问题,首先保证能写出来然后再去简化代码。
      1. package offer;
      2. /*
      3. 输入两棵二叉树A,B,判断B是不是A的子结构。
      4. */
      5. public class Test38 {
      6. /*
      7. public static boolean isSubTree(TreeNode treeA, TreeNode treeB) {
      8. //A是空树 返回false
      9. if (treeA == null) return false;
      10. if (treeB == null) return false;
      11. //A不能为空B也不能空
      12. //根节点数值相同 比较两个树的左右节点
      13. if (treeA.val == treeB.val) {
      14. if (treeA.left == null && treeA.right == null &&
      15. treeB.left == null && treeB.right == null) {
      16. return true;
      17. }
      18. if (treeA.left == null && treeB.left == null) {
      19. if (treeA.right != null && treeB.right != null) {
      20. if (isSubTree(treeA.right, treeB.right)) {
      21. return true;
      22. }
      23. }
      24. return false;
      25. } else if (treeA.left != null && treeB.left != null) {
      26. if (!isSubTree(treeA.left, treeB.left)) {
      27. return false;
      28. }
      29. if (treeA.right != null && treeB.right != null) {
      30. return isSubTree(treeA.right, treeB.right);
      31. }
      32. return false;
      33. }
      34. return false;
      35. } else {
      36. //根节点不相同 A的左是否等于B A的右是否等于B
      37. return isSubTree(treeA.left, treeB) || isSubTree(treeA.right, treeB);
      38. }
      39. }
      40. */
      41. public static boolean isSubStructure(TreeNode treeA, TreeNode treeB) {
      42. //先判断 AB为空的情况 两个要是空就不行
      43. if (treeA == null || treeB == null) return false;
      44. //当两个的根节点数值相等 不相等找左子树 不相等找右子树
      45. //用或 只要有一种情况可以就行
      46. return fun(treeA, treeB) || isSubStructure(treeA.left, treeB) || isSubStructure(treeA.right, treeB);
      47. }
      48. public static boolean fun(TreeNode treeA, TreeNode treeB) {
      49. //判断A B的根节点都相等的情况
      50. //只有一个节点相等 指向的下一个null
      51. if (treeB == null) return true;
      52. //当A走到没有节点的时候后 B还有则不相等
      53. //A B 的数值不相等 则不是子结构
      54. if (treeA == null || treeA.val != treeB.val)
      55. return false;
      56. //左右两边都相等才可以
      57. return fun(treeA.left, treeB.left) && fun(treeA.right, treeB.right);
      58. }
      59. public static void main(String[] args) {
      60. TreeNode node6 = new TreeNode(6, null, null);
      61. TreeNode node5 = new TreeNode(5, null, null);
      62. TreeNode node4 = new TreeNode(4, null, null);
      63. TreeNode node3 = new TreeNode(3, node6, null);
      64. TreeNode node2 = new TreeNode(2, node4, node5);
      65. TreeNode node1 = new TreeNode(1, node2, node3);
      66. System.out.println(isSubStructure(node1, node3));
      67. }
      68. }

      多用if-else不丢人,写不出来才丢人,不要一口吃个胖子,多写多debug才行。

    3. 刷题+springboot框架+github小项目 努力才能有收货

    4. 在问为什么我每天都很困呢?因为你没有信念,没有重要的事做,当你非常有动力做一件事肯定能起来,现在还不起来小心失业哦

  • 相关阅读:
    【PostgreSQL-14版本snapshot的几点优化】
    使用 Vert.X Future/Promise 编写异步代码
    网络安全(黑客)自学
    研究生数学建模竞赛——近五年赛题分析以及数据分析类赛题优秀论文分享
    一个综合资产收集和漏洞扫描工具
    【技术积累】Vue.js中的核心知识【五】
    linux 启动命令
    带码农《手写Mybatis》进度3:实现映射器的注册和使用
    Vue3较Vue2的更新内容(一)
    IDEA 修改插件安装位置
  • 原文地址:https://blog.csdn.net/carpdiem_fan/article/details/125491841