• 代码随想录 Day11 二叉树 LeetCode T144,145,94 前中后序遍历 (递归解法)


    题解及更详细解答来自于:代码随想录 (programmercarl.com)

    前言: 递归三要素

    1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

    2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

    3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

    LeetCode T144 二叉树的前序遍历

     

    题目链接: 144. 二叉树的前序遍历 - 力扣(LeetCode)

    题目思路:

    1.确定参数和返回值,我们只需传入一个树节点和一个result数组即可

    public void preOrder(TreeNode cur,List result)

    2.确认终止条件,当我们遍历的节点为空的时候,递归停止

    1. if(cur == null)
    2. {
    3. return ;
    4. }

    3.确认单层递归的逻辑:中左右的顺序递归

    1. result.add(cur.val);
    2. preOrder(cur.left,result);
    3. preOrder(cur.right,result);

    代码解析:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. public List preorderTraversal(TreeNode root) {
    18. List list = new ArrayList<>();
    19. preOrder(root,list);
    20. return list;
    21. }
    22. public void preOrder(TreeNode cur,List result)
    23. {
    24. if(cur == null)
    25. {
    26. return ;
    27. }
    28. result.add(cur.val);
    29. preOrder(cur.left,result);
    30. preOrder(cur.right,result);
    31. }
    32. }

    LeetCode T94 二叉树的中序遍历

    题目链接: 94. 二叉树的中序遍历 - 力扣(LeetCode)

    题目思路:

     1.确定参数和返回值,我们只需传入一个树节点和一个result数组即可

     public void inOrder(TreeNode cur,List result)

    2.确认终止条件,当我们遍历的节点为空的时候,递归停止

    1. if(cur == null)
    2. {
    3. return ;
    4. }

    3.确认单层递归的逻辑:左中右的顺序递归

    1. inOrder(cur.left,result);
    2. result.add(cur.val);
    3. inOrder(cur.right,result);

    代码解析:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. public List inorderTraversal(TreeNode root) {
    18. List result = new ArrayList<>();
    19. inOrder(root,result);
    20. return result;
    21. }
    22. public void inOrder(TreeNode cur,List result)
    23. {
    24. if(cur == null)
    25. {
    26. return ;
    27. }
    28. inOrder(cur.left,result);
    29. result.add(cur.val);
    30. inOrder(cur.right,result);
    31. }
    32. }

    LeetCode T145 二叉树的后序遍历

    题目链接: 145. 二叉树的后序遍历 - 力扣(LeetCode)

    题目思路:

      1.确定参数和返回值,我们只需传入一个树节点和一个result数组即可

        public void postOrder(TreeNode cur,List result)

    2.确认终止条件,当我们遍历的节点为空的时候,递归停止

    1. if(cur == null)
    2. {
    3. return ;
    4. }

    3.确认单层递归的逻辑:左中右的顺序递归

    1. postOrder(cur.left,result);
    2. postOrder(cur.right,result);
    3. result.add(cur.val);

    代码解析:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. public List postorderTraversal(TreeNode root) {
    18. List result = new ArrayList<>();
    19. postOrder(root,result);
    20. return result;
    21. }
    22. public void postOrder(TreeNode cur,List result)
    23. {
    24. if(cur == null)
    25. {
    26. return;
    27. }
    28. postOrder(cur.left,result);
    29. postOrder(cur.right,result);
    30. result.add(cur.val);
    31. }
    32. }

  • 相关阅读:
    1997-2019年樊纲市场化指数含stata do文档和原始数据
    接收网络视频数据并解码的探索
    玩转SpringBoot:SpringBoot的几种定时任务实现方式
    I/O多路复用详解
    vue3哪个数组方法在vue2上做了升级处理
    LeetCode 0813. 最大平均值和的分组
    【CVPR 2021】Cylinder3D:用于LiDAR点云分割的圆柱体非对称3D卷积网络
    simulink-自定义模块GUI回调函数
    springboot实现主从数据库动态切换(注解式)
    P1050 [NOIP2005 普及组] 循环 day16
  • 原文地址:https://blog.csdn.net/qiuqiushuibx/article/details/133580343