day14 | 二叉树的递归比遍历

题目
94. 二叉树的中序遍历
145. 二叉树的后序遍历
144. 二叉树的前序遍历

二叉树的递归遍历,首先要搞清楚两个概念 :

  1. 二叉树数遍历
  2. 递归

二叉树遍历
题目中提到的前序遍历、中序遍历、后续遍历
本质上就是中间元素所在的位置

  • 前序遍历:中左右
  • 中序遍历:左中右
  • 后序遍历:左右中

例子:
在这里插入图片描述
递归
递归的实现原理是用栈,在遇到递归的问题的时候先不要用自己的脑袋去递归,除非你确定自己有足够的深度
解决递归问题有三个关键的步骤

  • 确定最小问题:比如二叉树,当着这棵树只有三个节点的时候,数深为2,你如何实现前序、中序、后续遍历呢,是不是很简单就实现了;
  • 确定递归的终止条件:只要是递归,就一定有终止条件,都则就会栈溢出
  • 确定递归函数的入参和返回:确定那些参数是递归过程中需要处理的,那么就在递归函数里加上这个参数,还要明确每次递归函数值返回是什么,从而确定返回类型

代码实现

  • 二叉树前序遍历 (中左右)
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result =new ArrayList<>();
        preorder(root,result);
        return result;
    }
   
    /**
     * 中左右
     */
    private void preorder(TreeNode root,List<Integer> result ){
        if(root == null){
            return;
        }
        result.add(root.val);
        preorder(root.left,result);
        preorder(root.right,result);

    }
}
  • 二叉树中序遍历(左中右)
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
       List<Integer> result =new ArrayList<>();
       inorder(root,result);
       return result;
    }

   
   /**
    * 中序遍历 左中右
    */
    private void inorder(TreeNode root , List<Integer> result){
        if(root == null){
            return;
        }
        inorder(root.left,result);
        result.add(root.val);
        inorder(root.right,result);
    }
}

二叉树后序遍历(左右中)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result =new ArrayList<>();
        postorder(root,result);
        return result;
    }
   
   /**
    * 后续 左右中
    */
    private void postorder(TreeNode root,List<Integer> result ){
        if(root ==null ){
            return;
        }
        postorder(root.left,result);
        postorder(root.right,result);
        result.add(root.val);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值