LeetCode 递归法 + 二叉树前、中、后序遍历做题记录
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)
收获总结
递归算法的三个要素
- **【确定递归函数的参数和返回值】**确定哪些参数是递归过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型
- **【确定终止条件】**写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然会溢出
- 【确定单层递归的逻辑】 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。