C++超详细实现二叉树的遍历

 更新时间:2022年05月25日 11:09:26   作者:锡兰Ceylan_  
本章将会详细讲解二叉树遍历的四种方式,分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前,会先带大家回顾一下二叉树的基本概念

二叉树的遍历

Q:什么是二叉树的遍历?

A:二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次,且仅被访问一次。

Q:二叉树有几种遍历方法?

A:二叉树的遍历方法可以有很多种,如果限制了从左到右的习惯方式,那么主要分为以下四种:先序遍历,中序遍历,后序遍历,层序遍历。

前序遍历

Q:什么是先序遍历

A:先序遍历就是先访问树的根节点,再访问树的左子节点,再访问右子节点。可以想象为,从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果。

如图:遍历的顺序为 ABDGHCEIF

操作定义

若二叉树为空,则空操作返回,否则:

  • 访问根节点
  • 先序遍历左子树
  • 先序遍历右子树

代码演示

void PreOrderTraversal(BiTree BT)
{
    if( BT != NULL ) 
    {
        printf(“%d\n”, BT->Data);        //对节点的数据进行打印          
        PreOrderTraversal(BT->Left);     //访问左子树
        PreOrderTraversal(BT->Right);    //访问右子树
    }
}

中序遍历

Q:什么是中序遍历

A:中序遍历就是访问完所有左子数后再访问根节点,最后访问右子树,即左子树-根节点-右子树。中序遍历可以看成,二叉树每个节点,垂直方向投影下来,然后从左往右数,得出的结果便是中序遍历的结果。

如图:遍历的顺序为GDHBAECF

操作定义

若二叉树为空,则空操作返回,否则:

  • 中序遍历左子树
  • 访问根节点
  • 中序遍历右子树

代码演示

void InOrderTraversal(BiTree BT)
{
    if(BT)
    {
        InOrderTraversal(BT->Left);
        printf("%d\n", BT->Data);
        InOrderTraversal(BT->Right);
    }
}

后序遍历

Q:什么后序遍历

A:后序遍历就是先访问左子树和右子树,最后访问节点,即左子树-右子树-根节点。后序遍历可以看成围着树的外围绕一圈,若下面只有一个结点就摘下来,得出的结果便是后序遍历的结果。

如图:遍历的顺序为GHDBIEFCA

操作定义

若二叉树为空,则空操作返回,否则:

  • 后序遍历左子树
  • 后序遍历右子树
  • 访问根节点

代码演示

void PostOrderTraversal(BiTree BT)
{
    if (BT)
    {
        PostOrderTraversal(BT->Left);
        PostOrderTraversal(BT->Right);
        printf("%d\n", BT->Data);
    }
}

层序遍历

Q:什么层序遍历

A:层次遍历就是从根节点开始,一层一层,从上到下,每层从左到右,依次取值。

如图:遍历的顺序为ABCDEFGHL

代码演示

void LevelOrder(BiTree T){
	InitQueue(Q);				//初始化辅助队列
	BiTree p;
	EnQueue(Q,T);				//将根结点入队
	while(!IsEmpty(Q))
	{							//队列不空则循环
		DeQueue(Q,p);			//队头结点出队
		visit(p);				//访问出队结点
		if(p->1child!=NULL)
			EnQueue(Q,p->lchild);//左子树不空,则左子树根结点入队
		if(p->rchild!=NULL)
			EnQueue(Q,p->rchild);//右子树不空,则右子树根结点入队
	}
}

到此这篇关于C++超详细实现二叉树的遍历的文章就介绍到这了,更多相关C++二叉树遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用C++模拟实现STL容器:list

    利用C++模拟实现STL容器:list

    列表是一种顺序容器,它允许在序列中的任何位置执行常量时间插入和删除操作,并允许在两个方向上进行迭代。本文将利用C++模拟实现list,希望对大家有所帮助
    2022-12-12
  • C++控制台版扫雷游戏

    C++控制台版扫雷游戏

    这篇文章主要为大家详细介绍了C++控制台版扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 简单总结C语言中各种类型的指针的概念

    简单总结C语言中各种类型的指针的概念

    这篇文章主要简单总结了C语言中各种类型的指针的概念,指针可以说是C语言本身所具有的最大特性,平时根据不同使用场合习惯地将其简单分类,需要的朋友可以参考下
    2016-03-03
  • C++实现LeetCode(97.交织相错的字符串)

    C++实现LeetCode(97.交织相错的字符串)

    这篇文章主要介绍了C++实现LeetCode(97.交织相错的字符串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现扫雷小程序

    C语言实现扫雷小程序

    这篇文章主要为大家详细介绍了C语言实现扫雷小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言简析指针用途

    C语言简析指针用途

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍
    2022-07-07
  • 深入理解C++11:探索lambda函数的奥秘

    深入理解C++11:探索lambda函数的奥秘

    聚焦于C++11,让我们一起探索lambda函数的奥秘,本指南将带您深入了解这个强大的编程工具,让您在编程世界中如虎添翼,无论您是初学者还是有经验的开发者,本指南都将为您带来全新的视角和实用的技巧,需要的朋友可以参考下
    2024-01-01
  • C语言 实现遍历一个文件夹的所有文件

    C语言 实现遍历一个文件夹的所有文件

    这篇文章主要介绍了C语言 实现遍历一个文件夹的所有文件的相关资料,需要的朋友可以参考下
    2017-01-01
  • openCV中meanshift算法查找目标的实现

    openCV中meanshift算法查找目标的实现

    本文主要介绍了openCV中meanshift算法查找目标的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++之编写高效Makefile文件最佳方法

    C++之编写高效Makefile文件最佳方法

    在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署,然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高开发效率和产品质量,需要的朋友可以参考下
    2023-05-05

最新评论