C语言编程学习之二叉树的遍历图解

C语言是面向过程的,而C++是面向对象的

C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。


小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

1、先序遍历(先访问根节点)

先访问根节点

再先序遍历左子树

再先序遍历右子树

例:下图:先访问根节点A,再先序访问A的左子树B。A的左子树B是一个树 ,所以先访问树B的根节点B,再访问B的左子树D。B的左子树D是一个树,所以先访问D的根节点D,再访问D的左子树,D没有左子树,再访问D的右子树,D没有右子树,那么D访问完毕。再访问D的父亲B的右子树。B没有右子树,那么B访问完毕。这样A的左子树访问完毕,序号为ABD。再访问A的右子树C。先访问C的根节点C,再访问C的左子树E,由于E没有左子树和右子树,所以E访问完毕。再访问C的右子树F。F也是树,所以先访问F的根节点F,再访问F的左子树G。G也是一个数,所以先访问G的根节点G,而G没有左右子树,G访问完毕。再访问G的父亲F的右子树。F没有右子树,所以F访问完毕。因为F是C的右子树,所以F访问完毕则C访问完毕。C访问完毕则整个树访问完毕!

先序b遍历

2、中序遍历(中间访问根节点)

中序遍历左子树

再访问根节点

再中序遍历右节点

例:如下图:

第一步中序遍历A的左子树B,由于左子树B也是树,所以要先访问B的左子树D。由于左子树D也是树,所以要先访问D的左子树,D的左子树为空,所以第1个访问的是左子树的根节点D,再访问D的右子树,D的右子树为空。所以D访问完毕。D访问完毕则B的左子树访问完毕。第2个访问树B的根节点B。再访问B的右子树。因为B的右子树为空,所以B访问完毕。B访问完毕则A的左子树访问完毕,所以第3个访问的是A。再访问A的右子树C。因为C也是树,所以先访问C的左子树E。因为E也是树,所以先访问E的左子树,E的左子树为空,所以第4个访问的是E。再访问E的右子树,E的右子树为空,所以C的左子树访问完毕,接着访问C,所以第5个访问的是节点C。接着访问C的右子树F。因为F是树,所以先访问F的左子树G。因为G也是树,所以先访问G的左子树。G的左子树为空,所以第6个访问的是节点G。再访问G的右子树。G的右子树为空,所以节点G访问完毕。G访问完毕则F的左子树访问完毕,所以第7个访问的是节点F。F的右子树为空,所以F访问完毕,则C的右子树访问完毕,所以A的右子树访问完毕,整个树访问完毕!

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

中序遍历

3、后序遍历(最后访问根节点)

后序遍历左子树

后续遍历右子树

再访问根节点

后续遍历

已知两种遍历序列求二叉树:只有已知一个树的先序和中序或者是后序和中序,才可以还原出二叉树的样子。知道先序和后序是不可以还原出二叉树。

例1、已知先序和中序还原出二叉树:

例1:已知先序:ABCDEFGH

中序:BDCEAFHG

求后序

解:先序中第一个出现的一定是根节点,所以在先序中第一个出现的A是根节点。中序中找出该根节点左边为左子树,右边为右子树。由于中序是先访问左子树再访问根节点再访问右子树。所以在中序中A的左边是A的左子树,所以BDCE是A的左子树;

从先序中找到BDCE的顺序是BCDE所以B是A左子树的根节点;

在中序中B的左边一定是B的左子树。由于B左边没有,所以B没有左子树,DCE是B的右子树;

在先序中DCE三个个节点C是第一个出现的,所以C是B右子树的根节点;

再从中序中D和E分别在C的左右,所以D是C的左子树,E是C的右子树,这样A的左子树确定那个。

再同样确定A的右子树 在中序中A的右边FHG在先序中F第一个出现,所以F是A的右子树的根节点;

再从中序中F左边没有,所以F没有左子树;HG是F的右子树;

再从先序中确定HG第一个出现的是G,所以G是F的右子树的根;

再从中序中G左边是H,右边没有,所以H是G的左子是,G没有右子树。

这样还原出树和后序如下图:

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

例2、已知后序和中序求先序:

已知中序:BDCEAFHG

后序:DECBHGFA

求先序。

解:后序中最后一个一定是根节点,再在中序中找出做右子树。

从后序中求出根节点:A;

从中序中求出A的左子树:BDCE,右子树:FHG;

后序中求出A的左子树BDCE的根结点:B;

中序中求出B的左子树:空,右子树:DCE;

后序中求出树DCE的根节点:C;

中序中求出C的左子树:D,右子树:E;

后序中求出树A的右子树FHG根节点:F;

中序中求出F的左子树:空,右子树:HG;

先序中求出树HG的根节点:G;

中序中求出节点G的左子树:H,右子树:空。

这样还原出二叉树和其先序如下图:

~~~end~~~

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,489评论 1 31
  • 一直以来,我都很少使用也避免使用到树和图,总觉得它们神秘而又复杂,但是树在一些运算和查找中也不可避免的要使用到,那...
    24K男阅读 6,782评论 5 14
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,531评论 0 14
  • 基于树实现的数据结构,具有两个核心特征: 逻辑结构:数据元素之间具有层次关系; 数据运算:操作方法具有Log级的平...
    yhthu阅读 4,320评论 1 5
  • 好想有个自己的小窝,睡到自然醒,随时外放音乐,穿着内衣起舞。厨房是我的,满足吃货的一切欲望。浴室是我的,在水雾缭绕...
    Grim777阅读 123评论 0 0