六六力扣刷题二叉树之递归遍历

时间:2022-10-30 18:01:23


前言

之前小六六一直觉得自己的算法比较菜,算是一个短板吧,以前刷题也还真是三天打鱼,两天晒网,刷几天,然后就慢慢的不坚持了,所以这次,借助平台的活动,打算慢慢的开始开刷,并且自己还会给刷的题总结下,谈谈自己的一些思考,和自己的思路等等,希望对小伙伴能有所帮助吧,也可以借此机会把自己短板补一补,希望自己能坚持下去呀

链表的合集

  • ​​六六力扣刷题哈希表之哈希理论​​
  • ​​六六力扣刷题哈希表之有效的字母异位词​​
  • ​​六六力扣刷题哈希表之两个数组的交集​​
  • ​​六六力扣刷题哈希表之快乐数​​
  • ​​六六力扣刷题哈希表之赎金信​​
  • ​​六六力扣刷题哈希表之三数之和​​

字符串

  • ​​六六力扣刷题字符串之反转字符串​​
  • ​​六六力扣刷题字符串之反转字符串2​​
  • ​​六六力扣刷题字符串之替换空格​​
  • ​​六六力扣刷题字符串之反转字符串中的单词​​
  • ​​六六力扣刷题字符串之找出字符串中第一个匹配项的下​​
  • ​​六六力扣刷题字符串之重复的子字符串​​

双指针

  • ​​六六力扣刷题双指针之移除元素​​
  • ​​六六力扣刷题双指针之删除链表的倒数第N个节点​​
  • ​​六六力扣刷题双指针之链表相交​​
  • ​​六六力扣刷题双指针之三数之和​​
  • ​​六六力扣刷题双指针之反转链表​​

搜索二叉树

  • ​​六六力扣刷题二叉树之基础​​

讲讲递归

这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。

主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都靠运气。

这里帮助大家确定下来递归算法的三个要素。每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!

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

题目

  • ​​144.二叉树的前序遍历(opens new window)​​
  • ​​145.二叉树的后序遍历(opens new window)​​
  • ​​94.二叉树的中序遍历​​

前序遍历

首先我们需要了解什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
preorder(root, res);
return res;
}

public void preorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val);
preorder(root.left, res);
preorder(root.right, res);
}
}

中序遍历

首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
preorder(root, res);
return res;
}

public void preorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val);
preorder(root.left, res);
preorder(root.right, res);
}
}

后序遍历

首先我们需要了解什么是二叉树的后序遍历:按照访问左子树——右子树——根节点的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
postorder(root, res);
return res;
}

public void postorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
postorder(root.left, res);
postorder(root.right, res);
res.add(root.val);
}
}

结束

我们来总结一个口诀 前序遍历 根左右 中序遍历 左根右 后序遍历 左右根

我是小六六,三天打鱼,两天晒网!