• 【算法合集】学习算法第三天(二叉树遍历篇)


    ✅🎡个人主页:程序猿追

    ✅🎡系列专栏:算法合集

    ✅🎡目前状态:创建Java学习之路(零基础到就业实战)系列,目前更新到JAVAWEB开发

    ✅🎡作者简介:大家好,我是程序猿追,全栈领域新星创作者,算法爱好者,常在作者周榜排名前30,某不知名的 ACMer

    ✅🎡推荐一款刷题面试找工作三不误的网站——牛客网

    ✅🎡个人名言:不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!

    目录

    二叉树的前序遍历

    题解代码

    二叉树的中序遍历

     题解代码

    二叉树的后序遍历

    题解代码

    求二叉树的层序遍历

    题解代码


    二叉树的前序遍历

    描述

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

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

    示例1: 

    输入:

    {1,#,2,3}

    返回值:

    [1,2,3]

    题解代码

    1. import java.util.*;
    2. public class Solution {
    3. public void preorder(List list, TreeNode root){
    4. //遇到空节点则返回 fast-template
    5. if(root == null)
    6. return;
    7. //先遍历根节点
    8. list.add(root.val);
    9. //再去左子树
    10. preorder(list, root.left);
    11. //最后去右子树
    12. preorder(list, root.right);
    13. }
    14. public int[] preorderTraversal (TreeNode root) {
    15. //添加遍历结果的数组
    16. List list = new ArrayList();
    17. //递归前序遍历
    18. preorder(list, root);
    19. //返回的结果
    20. int[] res = new int[list.size()];
    21. for(int i = 0; i < list.size(); i++)
    22. res[i] = list.get(i);
    23. return res;}
    24. }

    二叉树的中序遍历

    描述

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

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

    示例1

    输入:

    {1,2,#,#,3}

    返回值:

    [2,3,1]
    

    说明:

     
    

    示例2

    输入:

    {}

    返回值:

    []

    示例3

    输入:

    {1,2}

    返回值:

    [2,1]

    说明:

    示例4

    输入:

    {1,#,2}

    返回值:

    [1,2]

     题解代码

    1. import java.util.*;
    2. public class Solution {
    3. public void inorder(List list, TreeNode root){
    4. //遇到空节点则返回 fast-template
    5. if(root == null)
    6. return;
    7. //先去左子树
    8. inorder(list, root.left);
    9. //再访问根节点
    10. list.add(root.val);
    11. //最后去右子树
    12. inorder(list, root.right);
    13. }
    14. public int[] inorderTraversal (TreeNode root) {
    15. //添加遍历结果的数组
    16. List list = new ArrayList();
    17. //递归中序遍历
    18. inorder(list, root);
    19. //返回的结果
    20. int[] res = new int[list.size()];
    21. for(int i = 0; i < list.size(); i++)
    22. res[i] = list.get(i);
    23. return res;}
    24. }

    二叉树的后序遍历

    描述

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

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

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

    样例图

    示例1

    输入:

    {1,#,2,3}

    返回值:

    [3,2,1]
    

    说明:

    如题面图   

    示例2

    输入:

    {1}

    返回值:

    [1]

    题解代码

    1. import java.util.*;
    2. public class Solution {
    3. public void postorder(List list, TreeNode root){
    4. //遇到空节点则返回 fast-template
    5. if(root == null)
    6. return;
    7. //先去左子树
    8. postorder(list, root.left);
    9. //再去右子树
    10. postorder(list, root.right);
    11. //最后访问根节点
    12. list.add(root.val);
    13. }
    14. public int[] postorderTraversal (TreeNode root) {
    15. //添加遍历结果的数组
    16. List list = new ArrayList();
    17. //递归后序遍历
    18. postorder(list, root);
    19. //返回的结果
    20. int[] res = new int[list.size()];
    21. for(int i = 0; i < list.size(); i++)
    22. res[i] = list.get(i);
    23. return res;}
    24. }

    求二叉树的层序遍历

    描述

    给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
    例如:
    给定的二叉树是{3,9,20,#,#,15,7},

    该二叉树层序遍历的结果是
    [
    [3],
    [9,20],
    [15,7] 

    ]

    数据范围:二叉树的节点数满足 1≤n≤105 

    示例1

    输入:

    {1,2}
    返回值:
    [[1],[2]]

    示例2

    输入:

    {1,2,3,4,#,#,5}

    返回值:

    [[1],[2,3],[4,5]]

    题解代码

    1. import java.util.*;
    2. public class Solution {
    3. public ArrayList> levelOrder (TreeNode root) {
    4. ArrayList > res = new ArrayList();
    5. if(root == null)
    6. //如果是空,则直接返回空数组 fast-template
    7. return res;
    8. //队列存储,进行层次遍历
    9. Queue q = new ArrayDeque();
    10. q.add(root);
    11. while(!q.isEmpty()){
    12. //记录二叉树的某一行
    13. ArrayList row = new ArrayList();
    14. int n = q.size();
    15. //因先进入的是根节点,故每层结点多少,队列大小就是多少
    16. for(int i = 0; i < n; i++){
    17. TreeNode cur = q.poll();
    18. row.add(cur.val);
    19. //若是左右孩子存在,则存入左右孩子作为下一个层次
    20. if(cur.left != null)
    21. q.add(cur.left);
    22. if(cur.right != null)
    23. q.add(cur.right);
    24. }
    25. //每一层加入输出
    26. res.add(row);
    27. }
    28. return res;}
    29. }

    算法对程序员来说及其重要,语言和开发平台不断变化,但是万变不离其宗的是那些算法和理论,依稀记得我那个玩的很好的一个学长(在大二就拿到了 offer),他告诉我想找一个好的工作,那刷题一定是必不可少的

    现在算法刷题平台还是蛮多的,给大家介绍一个我认为与大厂关联最深的平台——牛客网

  • 相关阅读:
    Java注解和工程搭建
    ITSS认证三级申报基本条件
    C语言读取文件字符串统计字母个数
    【622. 设计循环队列】
    通俗解释进程与线程
    头歌:第1关:有序单链表的插入操作
    SQL:增、删、改、查 基本语句 Navicat建库(用法 + 例子)
    【2023,学点儿新Java-48】变量与运算符 (阶段性复习):关键字和保留,回顾:标识符的命名规则,变量的基本使用
    基于RV1126 Video分析-----sensor模块所代表的subdev子设备注册
    安卓连接mysql数据库,使用okhttp
  • 原文地址:https://blog.csdn.net/aasd23/article/details/126274145