二叉树的前中后序遍历

2023-05-16

ced485cbb11e458d81a746890b32cf3f.gif 

作者:渴望力量的土狗

博客主页:渴望力量的土狗的博客主页

专栏:手把手带你刷牛客

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧

 

目录

二叉树的前序遍历:

 一、解题思路:递归

 二、解题思路:迭代

二叉树的中序遍历 :

 一、解题思路:递归

 二、解题思路:迭代 

 二叉树的后序遍历 :

一、解题思路:递归 

  二、解题思路:迭代 


二叉树的前序遍历:

二叉树的前序遍历的记忆法则是“根左右",即先遍历根节点,再遍历左子树节点,再遍历右子树节点。

如图所示: 

其遍历结果为【A, B, D, E, C, F, G】 

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

数据范围:二叉树的节点数量满足1≤n≤100 ,二叉树节点的值满足1≤val≤100,树的各节点的值各不相同

示例 1:

 

输入:
{1,#,2,3}
返回值:
[1,2,3]

 一、解题思路:递归

public class Solution {

    List<Integer> list = new ArrayList<>();

    public int[] preorderTraversal (TreeNode root) {
        List<Integer> list = preOrder(root);
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }

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

 二、解题思路:迭代

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] preorderTraversal (TreeNode root) {
        // 结果集合
        ArrayList<Integer> arr = new ArrayList();
        if(root == null) {
            return new int[0];
        }
        TreeNode current;
        // LinkedList 当作栈来使用
        LinkedList<TreeNode> list = new LinkedList<TreeNode>();
        list.addFirst(root);
        while(!list.isEmpty()) {
            current = list.removeFirst();
            arr.add(current.val);
            if(current.right != null) {
                list.addFirst(current.right);
            }
            if(current.left != null) {
                list.addFirst(current.left);
            }
        }
        // 循环赋值。
        int[] res = new int[arr.size()];
        for(int i = 0; i < arr.size(); i++) {
            res[i] = arr.get(i);
        }
        return res;
    }
}

二叉树的中序遍历 :

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

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

数据范围:树上节点数满足10000≤n≤1000,树上每个节点的值满足 −1000≤val≤1000
进阶:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

 示例1:

输入:
{1,2,#,#,3}
返回值:
[2,3,1]

 一、解题思路:递归

import java.util.*;
public class Solution {
    public void inorder(List<Integer> list, TreeNode root){
        //遇到空节点则返回
        if(root == null) 
            return;
        //先去左子树
        inorder(list, root.left); 
        //再访问根节点
        list.add(root.val); 
        //最后去右子树
        inorder(list, root.right); 
    }
    
    public int[] inorderTraversal (TreeNode root) {
        //添加遍历结果的数组
        List<Integer> list = new ArrayList(); 
        //递归中序遍历
        inorder(list, root); 
        //返回的结果
        int[] res = new int[list.size()]; 
        for(int i = 0; i < list.size(); i++)
            res[i] = list.get(i);
        return res;
    }
}

 二、解题思路:迭代 

import java.util.*;
public class Solution {
    public int[] inorderTraversal (TreeNode root) {
        //添加遍历结果的数组
        List<Integer> list = new ArrayList(); 
        Stack<TreeNode> s = new Stack<TreeNode>();
        //空树返回空数组
        if(root == null) 
            return new int[0];
        //当树节点不为空或栈中有节点时
        while(root != null || !s.isEmpty()){ 
            //每次找到最左节点
            while(root != null){ 
                s.push(root);
                root = root.left;
            }
            //访问该节点
            TreeNode node = s.pop(); 
            list.add(node.val); 
            //进入右节点
            root = node.right; 
        }
        //返回的结果
        int[] res = new int[list.size()]; 
        for(int i = 0; i < list.size(); i++)
            res[i] = list.get(i);
        return res;
    }
}

 二叉树的后序遍历 :

后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点 

给定一个二叉树,返回他的后序遍历的序列。

后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。

数据范围:二叉树的节点数量满足 1≤n≤100  ,二叉树节点的值满足1≤val≤100  ,树的各节点的值各不相同

 

输入:
{1,#,2,3}
返回值:
[3,2,1]

一、解题思路:递归 

import java.util.*;
public class Solution {
    public void postorder(List<Integer> list, TreeNode root){
        //遇到空节点则返回
        if(root == null) 
            return;
        //先去左子树
        postorder(list, root.left); 
        //再去右子树
        postorder(list, root.right); 
        //最后访问根节点
        list.add(root.val); 
    }
    
    public int[] postorderTraversal (TreeNode root) {
        //添加遍历结果的数组
        List<Integer> list = new ArrayList(); 
        //递归后序遍历
        postorder(list, root); 
        //返回的结果
        int[] res = new int[list.size()]; 
        for(int i = 0; i < list.size(); i++)
            res[i] = list.get(i);
        return res;
    }
}

  二、解题思路:迭代 

import java.util.*;
public class Solution {
    public int[] postorderTraversal (TreeNode root) {
        //添加遍历结果的数组
        List<Integer> list = new ArrayList(); 
        Stack<TreeNode> s = new Stack<TreeNode>();
        TreeNode pre = null;
        while(root != null || !s.isEmpty()){ 
            //每次先找到最左边的节点
            while(root != null){ 
                s.push(root);
                root = root.left;
            }
            //弹出栈顶
            TreeNode node = s.pop(); 
            //如果该元素的右边没有或是已经访问过
            if(node.right == null || node.right == pre){ 
                //访问中间的节点
                list.add(node.val); 
                //且记录为访问过了
                pre = node; 
            }else{
                //该节点入栈
                s.push(node); 
                //先访问右边
                root = node.right; 
            }
        }
        //返回的结果
        int[] res = new int[list.size()]; 
        for(int i = 0; i < list.size(); i++)
            res[i] = list.get(i);
        return res;
    }
}

  “ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树的前中后序遍历 的相关文章

  • Hadoop-HDFS 写数据流程

    HDFS写数据流程 xff1a 客户端向NameNode请求写数据 NameNode判断客户端针对该文件是否有写的权限 没有则报错 再判断文件是否存在 xff0c 不存在则报错 xff0c 存在则通知客户端上传 HDFS客户端负责对文件进行
  • 6.小项目.图片解码播放器-朱有鹏-专题视频课程

    6 小项目 图片解码播放器 6707人已学习 课程介绍 本课程是 朱有鹏老师嵌入式linux核心课程 第6部分 xff0c 是一个课程后的小项目 用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器 xff0c 实现了对
  • 思科arp欺骗攻击,cdp攻击,DHCP攻击实验命令笔记

    目录 Kali主机扫描 双向攻击 Cdp攻击防护 Stp攻击防护 Kali主机扫描 fping s r 2 g 192 168 1 0 24 扫描网段内存活的主机 arping 192 168 1 1 探测主机是否存活 双向攻击 Arpso
  • 命令草稿集

    port hybrid pvid vlan vlan id 指定Hybrid接口的缺省VLAN ID xff0c 缺省VLAN 1 以太网帧在无线接入控制器中都是以Tagged的形式处理转发的 xff0c 设备必须给接口收到的Untagge
  • mkdir和chmod命令

    1 在 usr目录中新建一个目录名称为 xff1a mytest 并在mytest目录中新建文件net txt 设置文件的属性为文件属主 xff08 u xff09 增加执行权限 文件属主同组用户 xff08 g xff09 增加写入权限
  • Eigen中的SparseMatrix(稀疏矩阵)元素的快速插入

    Eigen中的SparseMatrix xff08 稀疏矩阵 xff09 元素的快速插入 辰宸的备忘录 licc tech Eigen SparseMatrix lt float gt m 3 3 std vector lt Eigen T
  • 【Ubuntu22.04.2中文系统转换,添加中文输入法,修改快捷键】

    上一篇带大家完成了Ubuntu的安装 xff0c 现在来看看答应大家的后续吧 好多人安装Ubuntu后发现是英文 xff0c 找不到怎么切换中文系统和中文输入法 xff0c 今天本多就带大家来看看吧 xff08 看完哦 xff0c 最后面有
  • curl (7) Failed connect to localhost8080; Connection refused

    curl 7 Failed connect to localhost 8080 Connection refused 如果你也是curl 百度是正常的 xff0c curl xff08 自己IP xff09 正常 xff0c 但是 一 cu
  • Java面试基础篇

    Java面试基础篇 基础总结 博客链接导航 Java语言基础常识 https blog csdn net article details 88531257 J2EE基础知识 https blog csdn net article detai
  • 关于Mysql1251解决办法

    问题 xff1a 相信有些小伙伴在用Navicat连接Mysql时 xff0c 都遇到了这样的情况 xff0c 这其实是8 0以后的加密规则问题 解决办法 xff1a 1 我们打开以管理员身份打开cmd管理器 2 输入cdC Program
  • vue-router4路由报“[Vue Router warn] No match found for location with path“

    这里出现该问题的原因 xff1a 在路由配置了参数路径 但是 xff0c 跳转的路径没有参数 xff1a 因此控制台出现了 xff1a
  • Chrome(谷歌浏览器)安装Vue插件vue-devtools(图文详细教程)

    使用Vue开发项目时 xff0c 常会用到一款谷歌浏览器插件 xff0c vue devtools 安装成功后 xff0c 运行本地Vue项目 xff0c 打开浏览器控制台就如下 xff1a 其中可以便捷的查看vueX的数据以及组件结构等
  • 你不能错过的单片机课程-1.1.第1季第1部分-朱有鹏-专题视频课程

    你不能错过的单片机课程 1 1 第1季第1部分 3111人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第1个课程 xff0c 旨在对整个课程体系 学习方法和思路 配套开发板等进行介绍 xff0c 学习完本课程将对整个
  • redis如何设置密码

    密码设置 这里简单介绍一下redis如何设置密码 redis密码设置有两种方式 xff0c 一种需要重启redis服务 xff0c 一种不需要重启redis服务 首先 xff0c 介绍一下需要重启redis服务的设置方式 即找到redis的
  • linux 查看IP地址

    参考资料整理 一 在 linux 下可以通过两个命令来查看本机的 IP 地址 xff1a 1 支持包括 Linux 在内的所有 Unix 系统 sbin ifconfig 2 对于Linux 而言 xff0c 也可以使用 ip 命令查看 x
  • Docker 查看镜像信息

    本文中 xff0c 我们将需要学习 Docker 如何查看镜像信息 xff1f 一 images 命令列出镜像 通过使用如下两个命令 xff0c 列出本机已有的镜像 xff1a docker images 或 xff1a docker im
  • Google Chrome(谷歌浏览器)安装使用

    谷歌浏览器官网https www google cn chrome Chrome是由Google开发的一款简单便捷的网页浏览工具 谷歌浏览器 Google Chrome 可以提帮助你快速 安全的搜索到自己需要的内容 xff0c 功能强大 x
  • IDEA创建一个JavaWeb项目详细步骤

    刚好最近在写数据库大作业任务书 xff0c 留了一份 xff0c 发在博客上 提前说明 使用IDEA 43 Html5 43 CSS 43 JavaWeb 43 MySql开发 并使用Tomcat部署在本地服务器上 其中JDK版本为1 8
  • Nacos集群配置以及在springboot中使用

    1 下载nacos 官方地址为https github com alibaba nacos 2 将nacos解压 最好不要有中文路径 将cluster conf example文件改名为cluster conf 添加如下配置127 0 0

随机推荐