LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

这篇具有很好参考价值的文章主要介绍了LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


一、🌻二叉树

1.简介

二叉树是一种树形数据结构,其每个节点最多只有两个子节点。通常将节点分为三种类型:根节点、内部节点和叶子节点。其中,根节点是二叉树的唯一访问起点,内部节点具有一个父节点和两个子节点,而叶子节点没有子节点。二叉树的底层数据结构可以使用链表数组来实现。

二叉树的应用非常广泛,例如在计算机科学中,二叉树是许多数据结构的基础,例如二叉搜索树、红黑树、B树等。在计算机图形学中,二叉树可以用于表示场景图和计算机三维图形学中的视锥体。二叉树在编程面试中也是一个热门话题,它与许多基本数据结构和算法有着紧密的联系。

二叉树的操作包括插入、删除、查找、遍历等。其中,遍历是二叉树最基本的操作之一,包括前序遍历、中序遍历、后序遍历和层次遍历等。二叉树的复杂度取决于树的高度,平衡二叉树和自平衡二叉树用于减少树高和提高性能。

2.种类

二叉树可以分为以下几种种类:

  • 满二叉树:每个节点都有两个子节点,并且所有叶子节点都在同一层上。

  • 完全二叉树:除了最后一层,其他层的节点数都达到了最大值,并且最后一层的节点从左到右依次排列。

  • 平衡二叉树:左右子树的高度之差不超过 1。

  • 二叉搜索树(BST): 左子树上所有节点的值均小于它的根节点的值,右子树上所有节点的值均大于它的根节点的值,并且左右子树也分别为二叉搜索树。

  • 红黑树:一种自平衡的二叉搜索树,它满足以下条件:每个节点不是红色就是黑色;根节点是黑色的;每个叶子节点(NIL节点)都是黑色的;任何相邻的节点不能同时为红色;从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。

  • B树:一种多路平衡查找树,可以支持高效的查找、插入和删除操作。B树节点上可以存储多个关键字,同时每个节点都具有多个子节点,通常用于磁盘等外存储器上。

  • AVL树:一种自平衡的二叉搜索树,它的任何节点的左右子树的高度最多相差1。当一次插入或删除操作导致树不再满足平衡性时,需要通过旋转节点来进行调整,使树重新满足平衡性。

3.构造与遍历

二叉树的构造

以下图的二叉树为例子,假设给出数组格式:要求来构造一棵二叉树:
LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】
LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

  • 二叉树的体:定义一个二叉树类添加节点值,左右叶子,并提供构造方法和set方法
class TreeNode1 {
    int val;
    TreeNode1 left;
    TreeNode1 right;

    TreeNode1() {
    }
    TreeNode1(int val) {
        this.val = val;
    }
    TreeNode1(int val, TreeNode1 left, TreeNode1 right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    public void setVal(int val) {
        this.val = val;
    }
    public void setLeft(TreeNode1 left) {
        this.left = left;
    }
    public void setRight(TreeNode1 right) {
        this.right = right;
    }
}
  • 创建子节点方法
    对于节点和数组下标有一种对应关系:左子树节点下标是i*2+1,右子树节点下标是i*2+2
public static void creatNode(TreeNode1 p, char[] root1, int i) {
    if (i >= root1.length)
        return;
    p.setVal(root1[i]);//父节点

    if (i*2+1 < root1.length ) {
        //左子树  *2+1
        if (root1[i * 2 + 1] != ' ') {
            p.left = new TreeNode1();
            creatNode(p.left, root1, i * 2 + 1);
        } else p.left = null;
    }

    if (i*2+2 < root1.length ) {
        //右子树  *2+2
        if (root1[i * 2 + 2] != ' ') {
            p.right = new TreeNode1();
            creatNode(p.right, root1, i * 2 + 2);
        } else p.right = null;
    }
}
  • main函数在中根据数组内容创建头结点,使用creatNode进行子节点构造
    public static void main(String[] args) {
        char[] root1 = {5, 4, 6, 1, 2, 7, 8};
        TreeNode1 root = new TreeNode1();
        creatNode(root, root1, 0);

        List list = Solution144.preorderTraversal(root);
        for (Object o : list) {
            System.out.print(o);
        }
    }

二叉树的遍历

二叉树的遍历方法包括前序遍历、中序遍历、后序遍历和层次遍历:

前序遍历:先访问根节点,然后访问左子树,最后访问右子树。也可以描述为“根 - 左 - 右”的访问顺序。
LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

中序遍历:先访问左子树,然后访问根节点,最后访问右子树。也可以描述为“左 - 根 - 右”的访问顺序。
LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

后序遍历:先访问左子树,然后访问右子树,最后访问根节点。也可以描述为“左 - 右 - 根”的访问顺序。

层次遍历:从上到下,从左往右依次访问每个节点。

其中,前序、中序和后序遍历都是深度优先遍历(DFS),而层次遍历是广度优先遍历(BFS)。遍历方法的选择取决于具体应用场景。例如,前序遍历可以用来复制整棵树,中序遍历可以用来对二叉搜索树进行排序,后序遍历可以用来释放内存等。层次遍历则可以用来按层遍历树,或者求树的宽度等。

二、🍀LeetCode:二叉树的前、中、后序遍历

🌱144、先序遍历
🌱94、中序遍历
🌱144、后序遍历

  • 题目描述:给你二叉树的根节点 root ,返回它节点值的前序中序后序遍历。
  • 来源:力扣(LeetCode)
  • 难度:简单

🌴解题

1.先序遍历

这三种遍历使用递归方法只需要修改添加节点元素时机就可以了。

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

    private static void visitTree(TreeNode root, List<Integer> list) {
        if(root==null)
            return;
        list.add(root.val);
        //left
        if(root.left!=null)
            visitTree(root.left,list);
        //right
        if(root.right!=null)
            visitTree(root.right,list);
    }
}

LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

2.中序遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {        
        List<Integer> list=new ArrayList<>();
        visitTree(root,list);
        return list;
    }

    private static void visitTree(TreeNode root, List<Integer> list) {
        if(root==null)
            return;        
        //left
        if(root.left!=null)
            visitTree(root.left,list);
        list.add(root.val);
        //right
        if(root.right!=null)
            visitTree(root.right,list);
    }
}

LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

3.后序遍历

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        visitTree(root,list);
        return list;
    }
    private static void visitTree(TreeNode root, List<Integer> list) {
        if(root==null)
            return;        
        //left
        if(root.left!=null)
            visitTree(root.left,list);       
        //right
        if(root.right!=null)
            visitTree(root.right,list);
            list.add(root.val);
    }
}

LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

当然这不是最高效的方法,在官方题解还给出了迭代和Morris方法:力扣官方题解


🌵千古江山,英雄无觅,孙仲谋处。 —— 辛弃疾

返回第一页。☝

LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】


☕物有本末,事有终始,知所先后。🍭

LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓 文章来源地址https://www.toymoban.com/news/detail-408051.html

到了这里,关于LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树的前序、中序、后序遍历(递归版)

      二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。 1、二叉树的遍历方法 对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。 因为树的定义本身就是递归定义,

    2024年02月10日
    浏览(42)
  • 算法D14 | 二叉树1 | 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历

    理论基础  需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义  文章讲解: 二叉树既可以链式存储(利用指针,类似栈和队列),也可以用数组表示。 深度优先遍历 前序遍历(递归法,迭代法) 中序遍历(递归法,迭代法) 后序遍历(递归法,迭代法)

    2024年02月20日
    浏览(38)
  • 二叉树的前序/中序/后序遍历新手入门介绍

    前序遍历简介也叫先序遍历 前序遍历 可以分为三部分: 根、左子树、右子树 先遍历根节点 、再遍历左子树、再遍历右子树 左/右 子树遍历方法:先访问根节点,再访问 左孩子节点,访问到左孩子节点之后判断该左孩子节点 是否是 叶子节点 (叶子节点 也就是说 这个节点下

    2024年01月17日
    浏览(48)
  • 【数据结构】二叉树的前序遍历、中序遍历、后序遍历、层序遍历

    文章目录 1.二叉树的概念 1.1概念 1.2存储方式 1.3特殊的二叉树  1.4规律 2.二叉树的实现 2.1表现方式 2.2遍历     2.2.1前序遍历   思想   代码   详细分析      2.2.2中序遍历     2.2.3后序遍历     2.2.4层序遍历   思想   代码   详细过程         一棵二叉树是结点的一

    2024年04月23日
    浏览(38)
  • 树的前序遍历与中序遍历构造二叉树和树的中序遍历与后序遍历构造二叉树

    目录 一.树的前序遍历与中序遍历构造二叉树 1.题目描述 2.问题分析 3.代码实现 二.树的中序遍历与后序遍历构造二叉树 1.题目描述 2.问题分析 3.代码实现 三.问题思考 给定两个整数数组  preorder 和 inorder  ,其中  preorder 是二叉树的 先序遍历 , inorder  是同一棵树的 中序遍

    2023年04月15日
    浏览(40)
  • 【数据结构】二叉树的前中后序遍历(C语言)

    [二叉树] 顾名思义就是有 两个分支节点的树,不仅如此,除了叶子外的所有节点都具有两个分支节点; 由于结构像一棵倒立的树,顾名思义为二叉树 ; 如下图所示,该图即为一棵 野生的二叉树 ; 既然二叉树为树,固然有着和树一样的部分( 叶子、根、分支… ) 这些也成为

    2024年02月17日
    浏览(44)
  • 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 前序遍历的遍历方式是 先根节点 在左节点 在右节点 述这棵树前序遍历的结果是: A B D E C F G 递归的思想就是把问题拆分成一个个小问题来解决 treeNode是一个内部类 具体实现

    2023年04月26日
    浏览(52)
  • 算法练习第13天|递归实现 144.二叉树的前序遍历(opens new window)145.二叉树的后序遍历(opens new window)94.二叉树的中序遍历

    二叉树的存储方式:链式存储和顺序存储。链式存储用指针,顺序存储用数组。其结构如下图所示。 链式存储: 顺序存储: 顺序存储时,若父节点下表为i,则其左孩子下标为 2*i + 1,右孩子下标为2*i + 2. 二叉树主要有两种遍历方式: 深度优先遍历:先往深走,遇到叶子节点

    2024年02月22日
    浏览(51)
  • 算法刷题Day14 二叉树的前序、中序、后序遍历(递归、迭代、统一迭代方法)

    二叉树的定义 递归 迭代 普通的遍历(包括前序,中序和后续)迭代方法都需要借助到栈 统一迭代 统一迭代使用标记法,在栈中要处理的结点压入空指针 递归 迭代 中序遍历的迭代方法稍微特殊一点 中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问

    2024年02月15日
    浏览(47)
  • Leetcode 144. 二叉树的前序遍历

    题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

    2024年02月15日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包