数据结构|二叉树的三种遍历方式,你掌握了几种?

简介: 本文讲解:二叉树的三种遍历方式

 image.gif编辑

目录

1、遍历方式

2、前序遍历

3、中序遍历

image.gif编辑

1、遍历方式

学习二叉树的结构,最简单的方式就是遍历二叉树。遍历二叉树就是通过某条线路对二叉树的各个结点进行一次访问,访问的方法有三种分为前序遍历、中序遍历、后续遍历,层序遍历它们的遍历顺序如下所示:

    • 前序遍历:根节点=》根节点的左子树=》根节点的右子树
    • 中序遍历:根节点的左节点=》根节点=》根节点的右子树
    • 后续遍历:根节点的左节点=》根节点的右节点=》根节点

    在二叉树的遍历中,遍历的开始是从头节点开始的遍历的结束也是从头节点结束的。


    有一个二叉树,它有六个节点ABCDEF其值为123456。对应的结构为:

      • A为根节点时,A的左子树是D,A的右子树是E,A的值为1。
      • B为根节点时,B的左子树是D,B的右子树是E,B的值为2。
      • C为根节点时,C的左子树是null,C的右子树是F,C的值为3。
      • D为根节点时,D的左子树是null,F的右子树是null,的值为4。
      • E为根节点时,E的左子树是null,F的右子树是null,的值为5。
      • F为根节点时,F的左子树是null,F的右子树是null,的值为6。

      image.gif编辑

      本期博文所演练的遍历方式,均以上图中的二叉树进行展示。


      2、前序遍历

      前序遍历,我们在上方已经了解到了它的遍历顺序为:根节点=》根节点的左子树=》根节点的右子树。因此前序遍历上述的定义好的二叉树的顺序应为:ABDECF得到的值也应该为124536。具体实现方式看下方讲解:

      第一步,获取根节点A。判断A节点是否有左子树。有则往下一个左子树遍历。没有则遍历右子树,右子树也没有则返回父节点。如果无父节点则程序结束!

      此步骤往A的左子树进行遍历,首先获取A节点,发现A存在左子树,则往下遍历A的左子树节点。此时遍历到节点为:A、元素为:1。

      image.gif编辑


      第二步,来到B节点,获取B节点。判断B节点是否有左子树。有则往下一个左子树遍历。没有则遍历右子树,右子树也没有则返回父节点。如果无父节点则程序结束!

      此步骤往B的左子树进行遍历,发现B存在左子树,则往下遍历B的左子树节点。此时遍历到的节点为AB、元素为:12。

      image.gif编辑


      第三步,来到D节点,获取D节点。然后判断D节点是否有左子树有则往下一个节点遍历。没有则遍历右子树,右子树也没有则返回父节点。

      此时发现D没有左子树,遍历D的右子树发现右子树也没有,返回到B节点,并且往B节点的右子树进行遍历。 此时遍历到的节点为:ABD、元素为:124。

      image.gif编辑


      第四步,来到E节点,获取E节点。判断E是否有左子树。有则往下一个节点遍历。没有则遍历右子树,右子树也没有则返回父节点。

      此时,发现E节点没有左右子树,则返回到B节点,B节点再返回到A节点,A节点再遍历到C节点,此时遍历到的节点为:ABDE、元素为:1245。image.gif编辑


      第五步,来到C节点,获取C节点。判断C是否有左子树。有则往下一个节点遍历。没有则遍历右子树,右子树也没有则返回父节点。

      此时发现,C节点没有左子树,则访问C节点右子树F节点获取F节点的根节点。往F的左子树进行遍历,此时获取到的节点为:ABDEC,元素为:12453。

      image.gif编辑


      最后一步,来到F节点,获取F节点。F节点没有左右子树,返回F节点的父节点C节点,C节点再返回到C的父节点A节点。最后发现A没有父节点,程序结束。此时获取到的节点为:ABDECF,元素为:124536。


      以上就是对前序遍历步骤的一个详细讲解,下面我们来看代码的实现:

      //MyBinaryTree.java文件下
      public class MyBinaryTree {
          //静态内部类BinaryTree
          static class BinaryTree {
              public int val;
              public BinaryTree left;
              public BinaryTree right;
              public BinaryTree(int val) {
                  this.val = val;
              }
          }
          //根节点
          public BinaryTree root;
          //创建一个二叉树
          public void initBinaryTree() {
              BinaryTree A = new BinaryTree(1);
              BinaryTree B = new BinaryTree(2);
              BinaryTree C = new BinaryTree(3);
              BinaryTree D = new BinaryTree(4);
              BinaryTree E = new BinaryTree(5);
              BinaryTree F = new BinaryTree(6);
              A.left = B;
              A.right = C;
              B.left = D;
              B.right = E;
              C.right = F;
              root = A;
          }
          //前序遍历二叉树
          public void preOrder(BinaryTree tree) {
              if( tree == null) {
                  return;
              }
              //节点的元素
              System.out.print(tree.val+" ");
              //节点的左子树
              preOrder(tree.left);
              //节点的右子树
              preOrder(tree.right);
          }
      }
      //Test.java文件下
      public class Test {
          public static void main(String[] args) {
              MyBinaryTree myBinaryTree = new MyBinaryTree();
              myBinaryTree.initBinaryTree();
              myBinaryTree.preOrder(myBinaryTree.root);
          }
      }

      image.gif

      运行后输出:

      image.gif编辑

      我们可以运行后的结果与上述演练的最终结果是一致的。通过程序我们也不难看出二叉树的遍历是一种递归思想,它的终止条件就是节点本身不为空。另外细心的朋友可以发现前序遍历得到的首结果就是这个二叉树的头节点,因为头节点是第一个被遍历的。


      3、中序遍历

      中序遍历的顺序为:根节点的左节点=》根节点=》根节点的右节点。因此,中序遍历本期二叉树得到的根节点顺序为:DBEACF、根节点元素为:425136。

      第一步,遍历A的左节点。如果A节点有左节点往A的左节点遍历,不存在则获取A节点,并往A节点的右节点遍历,如果右节点也为空则返回父节点。此时,遍历到了B节点。以下的每个节点也是同此步骤进行的。


      第二步,遍历来到B节点。判断B节点的左节点不为空。遍历来到D节点,判断D节点的左子树为空,获取D节点,访问D的右子树为空返回父节点B,获取B节点的根节点。此时遍历到的节点为:DB,元素为:42。

      image.gif编辑


      第三步,遍历来到E节点。E节点的左子树为空,获取E节点,右子树也是空返回父节点B,B节点返回父节点A,获取A节点的根节点。此时遍历到的节点为:DBEA,元素为:4251。

      image.gif编辑


      第四步,遍历来到C节点。C节点的左子树为空,获取C节点,判断C节点的右子树不为空。遍历到F节点,此时遍历到的节点为:DBEAC,元素为:42513。

      image.gif编辑


      第五步,遍历来到F节点。F节点的左子树为空,获取F节点,F节点的右子树也为空返回父节点C,C节点返回父节点A,A节点没有父节点,程序结束。此时遍历到的节点为:DBEACF,元素为:425136。程序结束。

      image.gif编辑


      中序遍历,我们只需将上述代码中的preOrder方法中的访问节点的根节点位置稍微改动一下,其余代码不变。

      //中序遍历二叉树
      public void inOrder(BinaryTree tree) {
              if( tree == null) {
                  return;
              }
              //节点的左子树
              preOrder(tree.left);
              //节点的元素
              System.out.print(tree.val+" ");
              //节点的右子树
              preOrder(tree.right);
          }

      image.gif

      运行后输出:

      image.gif编辑

      通过上述结果,我们可以看到输出的结果与上方展示的结果是一致。细心的朋友可以发现,当我们中序遍历后头节点的左侧都是左子树,头节点的右侧都是右子树。在上方代码中1的左侧为425,1的右侧为36,正好与我们的二叉树一致。因此,当我们知道了一个二叉树的头节点是谁后可以通过中序遍历推出这个二叉树的左、右则的树。


      4、后序遍历

      后序遍历的步骤为:根节点的左节点=》根节点的右节点=》根节点,在本篇示例二叉树中对应的遍历节点顺序为:DEBFCA,节点元素为452631。

      在上文中,前序遍历与后序遍历我给大家展示了流程图以及实现步骤,其实后序遍历也是一样的按照左节点、右节点、根节点的遍历顺序去遍历,在此博主就不多讲解了,大家可以自己尝试去画图。

      后序遍历二叉树的代码,我们也是将preOrder方法中的根节点位置互换一下即可:

      //后序遍历二叉树    
      public void postOrder(BinaryTree tree) {
              if( tree == null) {
                  return;
              }
              //节点的左子树
              preOrder(tree.left);
              //节点的右子树
              preOrder(tree.right);
              //节点的元素
              System.out.print(tree.val+" ");
          }

      image.gif

      运行后输出:

      image.gif编辑通过运行结果可以看到与上方遍历得到的结果是一致的。通过观察,我们也可以知道。知道了一个二叉树的后序遍历,就能得到头节点,因为后序遍历的最后一个数据就是我们的头节点。


      当我们知道一个二叉树的前序遍历或后续遍历结果与中序遍历结果时,就能轻易的推出这个二叉树的全貌。

      如一个二叉树的前序遍历结果为:ABDECF,中序遍历结果为:DBEACF。则这个二叉树的头节点为:A,左侧子树为:DBE、右侧子树为CF。因此可以推出这个二叉树的全貌为:

      image.gif编辑

      当然,知道一个二叉树的中序遍历与后序遍历也能很轻松的推出这个二叉树,但知道前序遍历和后序遍历却不能推出这个二叉树,因为通过这两个遍历方式我们不能得到左侧、右侧的子树是什么。


      本期博客到这里就结束了,大家下来了可以自己去画图理解不懂之处或者私信博主、评论留言都可以。感谢你的阅读,我们下期再见!

      相关文章
      |
      1天前
      |
      Java C++
      【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
      本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
      25 12
      |
      1天前
      |
      C++
      【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
      本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
      26 10
      |
      1天前
      |
      存储 算法 测试技术
      【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
      本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
      14 2
      |
      15天前
      |
      数据库
      数据结构中二叉树,哈希表,顺序表,链表的比较补充
      二叉搜索树,哈希表,顺序表,链表的特点的比较
      数据结构中二叉树,哈希表,顺序表,链表的比较补充
      |
      1天前
      |
      数据采集 存储 算法
      【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
      本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
      9 0
      |
      2月前
      |
      机器学习/深度学习 存储 算法
      数据结构实验之二叉树实验基础
      本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
      105 4
      |
      2月前
      |
      C语言
      【数据结构】二叉树(c语言)(附源码)
      本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
      151 8
      |
      3月前
      |
      存储 算法 关系型数据库
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
      36 0
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      |
      3月前
      |
      存储 算法 搜索推荐
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
      43 0
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      |
      3月前
      |
      Java
      【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
      【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
      36 1