当前位置: 首页 > news >正文

40-算法打卡-二叉树-深度优先(前、中、后序遍历)-递归遍历-第四十天

1 递归思路

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

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

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

2 深度优先

2.1 前序遍历

前序遍历(VLR), [1]是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。

确定递归函数的参数和返回值:函数的参数需要包含当前节点,以及返回结果集合
         public void preorder(TreeNode currNode, List<Integer> resultList)
确定终止条件:当前节点的为NULL的时候终止
确定单层递归的逻辑:
        resultList.add(currNode.val);
        preorder(currNode.left, resultList);
        preorder(currNode.right, resultList);

2.1.1 题目地址

144. 二叉树的前序遍历 - 力扣(LeetCode)144. 二叉树的前序遍历 - 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1:输入:root = [1,null,2,3]输出:[1,2,3]解释:[https://assets.leetcode.com/uploads/2024/08/29/screenshot-2024-08-29-202743.png]示例 2:输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]输出:[1,2,4,5,6,7,3,8,9]解释:[https://assets.leetcode.com/uploads/2024/08/29/tree_2.png]示例 3:输入:root = []输出:[]示例 4:输入:root = [1]输出:[1] 提示: * 树中节点数目在范围 [0, 100] 内 * -100 <= Node.val <= 100 进阶:递归算法很简单,你可以通过迭代算法完成吗?https://leetcode.cn/problems/binary-tree-preorder-traversal/

2.1.2 题目描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]

输出:[1,2,3]

解释:

示例 2:

输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]

输出:[1,2,4,5,6,7,3,8,9]

解释:

示例 3:

输入:root = []

输出:[]

示例 4:

输入:root = [1]

输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

2.1.3 代码实现

/*** 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> resultList = new ArrayList<>();preorder(root, resultList);return resultList;}public void preorder(TreeNode currNode, List<Integer> resultList) {// 递归出口if (currNode == null) return;// 先序:存储根节点结果resultList.add(currNode.val);// 遍历左子树preorder(currNode.left, resultList);// 遍历右子树preorder(currNode.right, resultList);}
}

2.2 中序遍历

中序遍历是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。


2.2.1 题目地址

94. 二叉树的中序遍历 - 力扣(LeetCode)94. 二叉树的中序遍历 - 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1:[https://assets.leetcode.com/uploads/2020/09/15/inorder_1.jpg]输入:root = [1,null,2,3]输出:[1,3,2]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1] 提示: * 树中节点数目在范围 [0, 100] 内 * -100 <= Node.val <= 100 进阶: 递归算法很简单,你可以通过迭代算法完成吗?https://leetcode.cn/problems/binary-tree-inorder-traversal/


2.2.2 题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?


2.2.3 代码实现

/*** 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> resultList = new ArrayList<>();middleOrder(root, resultList);return resultList;}public void middleOrder(TreeNode currNode, List<Integer> resultList) {if (currNode == null) return;middleOrder(currNode.left, resultList);resultList.add(currNode.val);middleOrder(currNode.right, resultList);}
}

2.3 后序遍历

后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。


2.3.1 题目地址

145. 二叉树的后序遍历 - 力扣(LeetCode)145. 二叉树的后序遍历 - 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1:输入:root = [1,null,2,3]输出:[3,2,1]解释:[https://assets.leetcode.com/uploads/2024/08/29/screenshot-2024-08-29-202743.png]示例 2:输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]输出:[4,6,7,5,2,9,8,3,1]解释:[https://assets.leetcode.com/uploads/2024/08/29/tree_2.png]示例 3:输入:root = []输出:[]示例 4:输入:root = [1]输出:[1] 提示: * 树中节点的数目在范围 [0, 100] 内 * -100 <= Node.val <= 100 进阶:递归算法很简单,你可以通过迭代算法完成吗?https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

2.3.2 题目描述

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

输入:root = [1,null,2,3]

输出:[3,2,1]

解释:

示例 2:

输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]

输出:[4,6,7,5,2,9,8,3,1]

解释:

示例 3:

输入:root = []

输出:[]

示例 4:

输入:root = [1]

输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

2.3.3 代码实现

/*** 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> resultList = new ArrayList<>();afterOrder(root, resultList);return resultList;}public void afterOrder(TreeNode currNode, List<Integer> resultList) {if (currNode == null) return;afterOrder(currNode.left, resultList);afterOrder(currNode.right, resultList);resultList.add(currNode.val);}
}

 

http://www.xdnf.cn/news/366067.html

相关文章:

  • Langchain、RAG、Agent相关
  • 【MyBatis-6】MyBatis动态SQL:灵活构建高效数据库查询的艺术
  • AI融合SEO关键词智能优化
  • 三轴云台之视觉跟踪系统篇
  • 算法设计与分析复习代码(hnust)
  • 聊一部很癫的电影
  • 数据结构与算法分析实验10 实现最短路径算法
  • Linux——多线程
  • 前端常见七种报错类型及解决方案
  • Linux vi/vim编辑器常用命令
  • 多分类问题softmax传递函数+交叉熵损失
  • 嵌入式学习笔记 - 关于结构体成员地址对齐问题
  • Edu教育邮箱申请成功下号
  • Knife4j文档的会被全局异常处理器拦截的问题解决
  • Python MNE-Python 脑功能磁共振数据分析
  • IO-Link系列集线器(三格电子)
  • MySQL 安全架构:从渗透测试到合规审计
  • 对称加密以及非对称加密
  • 从零理解 RAG:检索增强生成的原理与优势
  • Linux系统Shell脚本之sed
  • 深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件
  • css样式实现-新闻列表
  • MySQL相关查询
  • 在 MyBatis 中实现控制台输出 SQL 参数
  • htmlUnit和Selenium的区别以及使用BrowserMobProxy捕获网络请求
  • RoPE长度外推:外插内插
  • ResNet详解
  • 企业名录搜索软件靠谱吗 企业名录搜索软件怎么使用
  • LSTM的简单模型
  • git做commit信息时的校验