LeetCode 递归法 + 二叉树前、中、后序遍历

本文详细探讨了使用递归法解决LeetCode中的二叉树前序、中序和后序遍历问题。分别给出了针对144、94和145题的Java解法,分析了每种遍历的时间复杂度和空间复杂度,均为O(n),并总结了递归算法的三个关键要素:确定参数和返回值、设置终止条件以及明确单层递归逻辑。
摘要由CSDN通过智能技术生成

144 递归+前序遍历

题目描述

我的解法

对应Java代码

在这里插入图片描述

class Solution {
    List<Integer> result = new ArrayList<Integer>();
    public List<Integer> preorderTraversal(TreeNode root) {
        traversal(root, result);
        return result;
    }
    public void traversal(TreeNode root, List<Integer> result){
        if(root == null) { return; }
        result.add(root.val);
        traversal(root.left, result);
        traversal(root.right, result);
    }
}

复杂度分析

时间复杂度:O(n) 其中n是二叉树的节点数,每个节点恰好被遍历一遍
空间复杂度:O(n) 为递归过程中栈的开销,平均情况下为O(logn),最坏情况下树呈现链状,为O(n)

94 递归+中序遍历

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jnjfvm5r-1617332239705)(en-resource://database/2123:0)]

题目描述

在这里插入图片描述

我的解法

对应Java代码

在这里插入图片描述

class Solution {
    List<Integer> result = new ArrayList<Integer>();
    public List<Integer> inorderTraversal(TreeNode root) {
        traversal(root, result);
        return result;
    }
    public void traversal(TreeNode root, List<Integer> result){
        if(root == null){
            return;
        }
        traversal(root.left, result);
        result.add(root.val);
        traversal(root.right, result);
    }
}

复杂度分析

同前序
时间复杂度:O(n)
空间复杂度:O(n)

145 递归+后序遍历

题目描述

我的解法

对应Java代码

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        traversal(root, result);
        return result;
    }
    public void traversal(TreeNode root, List<Integer> result){
        if(root == null){
            return;
        }
        traversal(root.left, result);
        traversal(root.right, result);
        result.add(root.val);
    }
}

复杂度分析

同上
时间复杂度:O(n)
空间复杂度:O(n)

收获总结

递归算法的三个要素

  1. **【确定递归函数的参数和返回值】**确定哪些参数是递归过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型
  2. **【确定终止条件】**写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然会溢出
  3. 【确定单层递归的逻辑】 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值