day20【代码随想录】二叉树的前序遍历、二叉树的中序遍历、二叉树的后序遍历

news2024/11/30 0:28:08

文章目录

  • 前言
  • 一、二叉树的前序遍历(力扣144)
    • 1、递归遍历
    • 2、非递归遍历
  • 二、二叉树的中序遍历(力扣94)
    • 1、递归遍历
    • 2、非递归遍历
  • 三、二叉树的后序遍历(力扣145)
    • 1、递归遍历
    • 2、非递归遍历
  • 总结


前言

1、二叉树的前序遍历
2、二叉树的中序遍历
3、二叉树的后序遍历


一、二叉树的前序遍历(力扣144)

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

1、递归遍历

/**
 * 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<>();
        if(root==null){
            return result; 
        }
        preOrder(root,result);
        return result;

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

在这里插入图片描述

2、非递归遍历

图解:(来源:代码随想录)
link

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null){
            return result; 
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if(node.right!=null){
                stack.push(node.right);
            }
            if(node.left!=null){
                stack.push(node.left);
            }
        }
        return result;
    }
}

在这里插入图片描述

二、二叉树的中序遍历(力扣94)

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

1、递归遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null){
            return result;
        }
        inorder(root,result);
        return result;

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

在这里插入图片描述

2、非递归遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(cur!=null || !stack.isEmpty()){
            if(cur!=null){
                stack.push(cur);
                cur=cur.left;
            }else{
                cur = stack.pop();
                result.add(cur.val);
                cur=cur.right;
            }
        }
        return result;
    }
}

在这里插入图片描述

三、二叉树的后序遍历(力扣145)

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

1、递归遍历

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null){
            return result;
        }
        postOrder(root,result);
        return result;

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

在这里插入图片描述

2、非递归遍历

在这里插入图片描述

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        //搭了先序遍历的顺风车  根左右的顺序  根右左---> 翻转  后序(左右根)
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if(node.left!=null){
                stack.push(node.left);
            }
            if(node.right!=null){
                stack.push(node.right);
            }
        }
        Collections.reverse(result);
        return result;
    }
}

在这里插入图片描述


总结

1、确定递归函数的参数返回值
2、确定终止条件
3、确定单层递归的逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十一、JavaScript——字符串

一、转义字符 字符串 在 JS中使用单引号或者双引号来表示字符串&#xff08;要么全用双引号&#xff0c;要么全用单引号&#xff0c;不要混着用&#xff09; 转义字符 反斜杠 \ 使用typeof检查转义字符返回的是string类型 在 JS中使用单引号或者双引号来表示…

零成本实现接口自动化测试 – Java+TestNG 测试Restful service

接口自动化测试 – JavaTestNG 测试 Restful Web Service 关键词&#xff1a;基于Rest的Web服务&#xff0c;接口自动化测试&#xff0c;数据驱动测试&#xff0c;测试Restful Web Service&#xff0c; 数据分离&#xff0c;JavaMavenTestNG 本文主要介绍如何用Java针对Restf…

【Lilishop商城】No3-9.模块详细设计,订单模块-3(售后)的详细设计

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代…

Seata-TCC快速上手

原文链接 如果是小白&#xff0c;可以先看TCC步骤&#xff0c;核心思想&#xff0c;然后使用Seata&#xff0c;阅读Seata官方提供的示例代码&#xff0c;验证自己的猜想&#xff0c;再看遍TCC。 分布式事务是跨过多个数据库或者系统的事务&#xff0c;在电商、金融领域应用十…

[附源码]Node.js计算机毕业设计房屋租赁管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

web前端Javascript学习之了解JavaScript弹出框

在JavaScript中&#xff0c;可以创建对话框或弹出窗口来与用户进行交互。 JavaScript具有三种不同类型的弹出框&#xff1a;警告框&#xff0c;确认框和提示框。 一、警告框 警告框是最简单的弹出框。它使可以向用户显示一条短消息。还包括“确定”按钮&#xff0c;用户必须…

巧用Github Action 自动推送docker镜像,白piao github服务器资源,还省时又省力

对于个人开发者来说如果不想再自己电脑上搭建CI/DI系统&#xff08;毕竟吃资源&#xff09;&#xff0c;Github Action是一个不二的选择。 本文我们来通过 Github Action 实现 SpringBoot 项目的自动编译、制作doceker镜像&#xff0c;最后推送到docker hub 仓库。 Github Acti…

亿华通通过上市聆讯:第三季营收降53% 净亏3457万

雷递网 雷建平 12月13日北京亿华通科技股份有限公司&#xff08;简称&#xff1a;“亿华通”&#xff09;日前通过聆讯&#xff0c;准备在香港上市。这之前&#xff0c;亿华通是2020年8月在科创板上市&#xff0c;发行价为76.65元&#xff0c;发行17,630,523股&#xff0c;募集…

技术分享 | 测试平台开发-前端开发之Vue.js 框架(一)

Vue.js 是一套用于构建用户界面的渐进式框架&#xff0c;在目前的前端开放中比较流行的前端框架。 Vue 被设计成自底向上的逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或已有项目整合。但是学习 Vue.js 需要一定的 HTML、CSS、和…

09、SpringBoot中集成SSM及其他插件

1、创建spring Boot项目导入如下基础依赖 <!-- 打包方式 jar 包 --> <packaging>jar</packaging><!-- 指定父工程 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</art…

[附源码]Node.js计算机毕业设计房屋中介管理信息系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Python计算机毕业设计SSM基于web的图书借阅管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

常规设置Apache服务器实例

常规设置Apache服务器实例 1&#xff0e;设置文档根目录和首页文件的实例 【例1】默认情况下&#xff0c;网站的文档根目录保存在/var/www/html中&#xff0c;如果想把保存网站文档的根目录修改为/home/wwwroot&#xff0c;并且将首页文件修改为myweb.html&#xff0c;那么该如…

CPU一级缓存L1 D-cache\L1 I-cache与二级缓存L2 cache深度分析

CPU缓存&#xff1a;通过优化的的读取机制&#xff0c;可以使CPU读取缓存的命中率非常高&#xff08;大多数CPU可达90%左右&#xff09;&#xff0c; 也就是说CPU下一次要读取的数据90%都在缓存(SRAM)中&#xff1b; 只有大约10%需要从内存&#xff08;DRAM、DDR等&#xff0…

MATLAB抽样定理实验

目录 一、实验目的 二、实验原理 三、实验要求 四、实验内容 1、连续时间信号时域波形及其幅度谱 2、信号进行抽样 3、频谱分析 4、由各抽样信号恢复出连续时间信号&#xff0c;计算并画出误差函数 一、实验目的 1、掌握抽样定理工作原理 2、练习使用Matlab编程进行抽…

非零基础自学Golang 第2章 安装和运行Go 2.5 安装开发工具

非零基础自学Golang 第2章 安装和运行Go 2.5 安装开发工具 互联网有很多可用的开发工具&#xff08;IDE&#xff09;&#xff0c;对于Go开发者来说&#xff0c;选一款最好用的工具&#xff0c;可以更高效地编码和构建项目。 GoLand是一款由JetBrains公司&#xff08;一家技…

【面试题】三面 面试官:运行 npm run xxx 的时候发生了什么?

大厂面试题分享 面试题库 前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 事情是这样的&#xff0c;直接开讲 面试官&#xff1a;npm run xxx的时候&#xff0c;发生了什么&#xff1f;讲的越详细越好。 我&am…

智能家居DIY之智能插座

WiFi智能插座对于新手接触智能家居产品更加友好&#xff0c;不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷&#xff0c;智能插座就是其中之一&#xff0c;比如外出忘记关空调&#xff0c;可以拿起手机远程关闭。 简单说就是&#xff1a;插座可以连接wi…

深度学习的初学者用哪本书比较好的?

先推荐一本从基本概念和理论入手的深度学习书&#xff1a; 深度学习&#xff1a;从基础到实践&#xff08;上、下册&#xff09; 本书从基本概念和理论入手&#xff0c;通过近千张图和简单的例子由浅入深地讲解深度学习的相关知识&#xff0c;且不涉及复杂的数学内容。 本书分…

交叉梯度函数的MATLAB实现及代码分享01

交叉梯度函数的MATLAB实现及代码分享01 交叉梯度函数可用于反演成像中。作为一个连接不同物性参数的桥梁&#xff0c;交叉梯度函数可以实现不同物性参数的联合反演成像。 文章目录交叉梯度函数的MATLAB实现及代码分享01一、交叉梯度函数的定义二、交叉梯度函数的性质三、模型算…