【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解

这篇具有很好参考价值的文章主要介绍了【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

本篇博客(上篇)先带大家学习递归方式进行三种遍历,

而在后续的(下篇)中将为大家详细讲解非递归的三种遍历方式。

目录

1、二叉树

2、二叉树的递归遍历

2.1、先序遍历

2.2、中序遍历

2.3、后序遍历 


【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

1、二叉树

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

2、二叉树的递归遍历

要了解二叉树的递归遍历写法,首先来了解一下递归序

递归序就是按照先序遍历的顺序,遇到的所有结点按顺序排列,重复的结点也必须记录。

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

我们可以发现递归序中每个结点都会遇到三次。

这是因为当进入某一结点时,对该结点进行第一次操作,然后调用其左孩子结点,等左孩子结点结束调用时会返回自己,此时就可以对自己进行第二次操作,然后再调用其右孩子结点,等左孩子结点结束调用时又会返回自己,此时就可以对自己进行第三次操作,因为不管怎样,调用完孩子结点后终究会返回到父结点。

下面用代码来给大家举例子:

    public static void f(Node head) {
		//1

        //1
		f(head.left);
        //2

        //2
		f(head.right);
        //3

        //3
	}

上面代码中:虽然此时代码中并没有对该节点进行其他操作,但是如果有的话

注释1部分就是该结点第一次被操作的时候,

注释2部分就是该结点第二次被操作的时候,

注释3部分就是该结点第三次被操作的时候。

2.1、先序遍历

对于所有子树,都是遵循【头左右】的顺序进行操作。

例如操作是打印结点,那么就应该先打印头结点,然后在打印左子树的结点,左子树的结点打印依然遵循【头左右】的操作顺序,然后再打印右子树的结点,操作也一样。

先序遍历为:1,2,4,5,3,6,7。

对于1来说,是先打印了1再到2和3,对于3来说,是先打印了3再到6和7。

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

那么递归序在这里有什么用呢?递归序中第一次遇到该节点时打印结点,第二次第三次均不做任何操作,这就是先序遍历。如下图:

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

 那么用代码表示就是在注释1处增加打印操作即是先序遍历。

	public static void preOrderRecur(Node head) {
		//1
        if (head == null) {
			return;
		}
		System.out.print(head.value + " ");   //在第一次遇到该结点时打印
        //1
		preOrderRecur(head.left);
        //2
        //2
		preOrderRecur(head.right);
        //3
        //3
	}

2.2、中序遍历

对于所有子树,都是遵循【左头右】的顺序进行操作。

例如操作是打印结点,那么就应该先打印头结点的左子树的所有结点,左子树的结点打印依然遵循【左头右】的操作顺序,然后返回到头节点此时对头节点进行打印,然后再打印右子树的结点,操作也一样。

中序遍历为:4,2,5,1,6,3,7。

对于1来说,是先打印了2再到1然后到3,对于3来说,是先打印了6再到3然后到7。

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

递归序中第二次遇到该节点时打印结点,第一次第三次均不做任何操作,这就是中序遍历。如下图:

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

 那么用代码表示就是在注释2处增加打印操作即是中序遍历。

	public static void inOrderRecur(Node head) {
        //1
		if (head == null) {
			return;
		}
        //1
		inOrderRecur(head.left);
        //2
		System.out.print(head.value + " ");  //在第二次遇到该结点时打印
        //2
		inOrderRecur(head.right);
        //3
        //3
	}

2.3、后序遍历 

对于所有子树,都是遵循【左右头】的顺序进行操作。

例如操作是打印结点,那么就应该先打印头结点的左子树的所有结点,左子树的结点打印依然遵循【左右头】的操作顺序,返回到头节点不做操作,然后打印右子树的结点,操作也一样。最后返回到头节点此时对头节点进行打印。

后序遍历为:4,5,2,6,7,3,1。

对于1来说,是先打印了2再到3然后到1,对于3来说,是先打印了6再到7然后到3。

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

递归序中第三次遇到该节点时打印结点,第一次第二次均不做任何操作,这就是后序遍历。如下图:

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

  那么用代码表示就是在注释3处增加打印操作即是后序遍历。

	public static void posOrderRecur(Node head) {
        //1
		if (head == null) {
			return;
		}
        //1
		posOrderRecur(head.left);
        //2
        //2
		posOrderRecur(head.right);
        //3
		System.out.print(head.value + " ");   在第三次遇到该结点时打印
        //3
	}

【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解,算法与数据结构,算法,数据结构,java,开发语言,intellij-idea

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!文章来源地址https://www.toymoban.com/news/detail-713481.html

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

到了这里,关于【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构】二叉树的遍历递归算法详解

    我们来写一个函数 BuyNode(x)函数 用于创建二叉树结点。 用动态开辟函数 malloc 函数进行动态开辟,并强制转换为 BTNode 型,用变量 node 来去管理开辟的空间。 我们初始化结点,其 val 即为传入的参数x,左右指针 left 和 right 都设为NULL。 我们在主函数中创建上面这样一颗二叉树

    2024年01月20日
    浏览(45)
  • 【数据结构和算法15】二叉树的实现

    二叉树是这么一种树状结构:每个节点最多有两个孩子,左孩子和右孩子 重要的二叉树结构 完全二叉树(complete binary tree)是一种二叉树结构,除最后一层以外,每一层都必须填满,填充时要遵从先左后右 平衡二叉树(balance binary tree)是一种二叉树结构,其中每个节点的左

    2024年02月16日
    浏览(34)
  • 【数据结构与算法】二叉树的知识讲解

    目录  一,二叉树的结构深入认识  二,二叉树的遍历  三,二叉树的基本运算 3-1,计算二叉树的大小 3-2,统计二叉树叶子结点个数 3-3,计算第k层的节点个数 3-4,查找指定值的结点         二叉树是不可随机访问的,二叉树的结构是通过双亲结点与孩子结点之间的连接进

    2024年02月08日
    浏览(41)
  • 【数据结构】【算法】二叉树、二叉排序树、树的相关操作

    树结构是以分支关系定义的一种层次结构,应用树结构组织起来的数据,逻辑上都具有明显的层次关系。 操作系统中的文件管理系统、网络系统中的域名管理、数据库系统中的索引管理等都使用了树结构来组织和管理数据。 树 Tree 是由n个节点组成的有限集合。在任意一颗非

    2024年02月04日
    浏览(53)
  • 数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

    目录 基本介绍 平衡因子 平衡二叉树  平衡二叉树的高度  什么是平衡二叉树? 以一个例子来解释一下: 搜索树结点按不同的插入次序,将会导致不同的深度和平均查找长度ASL   在二叉搜索树中查找一个元素:  (a)要找到Jan,需要查找一次;要找到Feb,需要查找两次;

    2023年04月26日
    浏览(65)
  • 【数据结构与算法】力扣:二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3: 输入:root = [] 输出:[] 来源:力扣(LeetCode) 链接:https://leetcode.cn/p

    2024年02月13日
    浏览(46)
  • 数据结构与算法----详解二叉树的遍历(迭代、递归)

    ❤️ 作者简介 :大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生,蓝桥杯国赛二等奖获得者 🐟 个人主页 :https://blog.csdn.net/qq_52007481 ⭐ 个人社区 :【小鱼干爱编程】 🔥 算法专栏 :算法竞赛进阶指南 💯 刷题网站 :虽然市面上有很多的刷题网站,但是里面

    2024年01月24日
    浏览(54)
  • 数据结构与算法之二叉树: Leetcode 111. 二叉树的最小深度 (Typescript版)

    二叉树的最小深度 https://leetcode.cn/problems/minimum-depth-of-binary-tree/ 描述 就 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1 示例 2 提示 树中节点数的范围在 [0, 1 0 5 10^5 1 0 5 ] 内

    2024年02月06日
    浏览(44)
  • 【算法与数据结构】236、LeetCode二叉树的最近公共祖先

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 : 根据定义,最近祖先节点需要遍历节点的左右子树,然后才能知道是否为最近祖先节点。 那么这种需求是先遍历左右节点,然后遍历中间节点,属于左右中的后序遍历模式 。因此

    2024年02月09日
    浏览(38)
  • 【算法与数据结构】222、LeetCode完全二叉树的节点个数

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :利用层序遍历,然后用num++记录节点数量。其他的例如递归法和迭代法也是如此。    层序遍历程序如下 : 复杂度分析: 时间复杂度: O ( n ) O(n) O ( n ) 。 空间复杂度: O ( n )

    2024年02月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包