c语言利用遍历求树高的程序,用C语言实现二叉树的遍历极其应用

用C语言实现二叉树的遍历极其应用

[1]〔摘要〕:《数据结构》是计算机系学生的一门专业技术基础课程,计算机科学各领域及有关的应用软件都要用到各种数据结构。C语言有较丰富的数据类型、运算符以及函数,能直接与内存打交道,使修改、编辑其他程序与文档变得简单,因此用C语言实现的《数据结构》程序越来越得到广泛应用。树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。二叉树的遍历算法是树形结构中其他运算的基础,在二叉树遍历的各种算法中包括了一些精致的,并且在其他应用范围内也有用的技巧,所以本文主要讨论用C语言去实现二叉树遍历的几种不同算法。

[关键词]: 数据结构; 树; 二叉树; 二叉树的遍历; C语言

《数据结构》在计算机科学中是一门综合性的专业基础课。《数据结构》的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序,还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。可以认为《数据结构》是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,是从事计算机科学及其应用的科技工作者必须掌握的重要课程。

在《数据结构》中,树型结构是结点之间有分支的、层次的关系的结构。树结构在客观世界中广泛存在,如人类的族谱、动植物的分类、图书情报资料的编目等,都可以按照层次表示成树的形式。在计算机程序设计方面,树也是很重要的,如在编译程序中,可以用树来表示源程序的语法结构。又如在数据库系统中,树形结构也是信息的重要组织形式之一。

树型结构是一类重要的非线性数据结构。其中以树和二叉树最为常用。

1、 树 (Tree)

树是n(n>=0)

个结点的有限集。在一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……,Tm,其中每一个集合本身又是一棵树,并且称为子树(Subtree)。结点拥有的子树数称为结点的度(degree)。树的度是树内各结点的度的最大值。

2、 二叉树 (Binary tree)

二叉树是另一种树型结构,它的特点是每个结点至多只有二棵子树(即二叉树中不存在度大于2的结点),二叉树的子树有左右之分,其次不能任意颠倒。二叉树第i层上的结点数目最多为2i-1(i>=1);深度为k的二叉树至多有2k-1个结点,(k≥1);对任何一棵二叉树T,如果其终端结点数n0,度为2的结点数为n2

,则n0=n2+1。

对于使用C语言去实现二叉树,首先需要抽象其二叉树的数据类型。也就是需要构造一个基本二叉树的基础操作的类和一个二叉树结点数据类型。

第一步分析结点数据类型;

二叉树的结点包括有本身的数据和左右子女的位置。

第二步是去设计二叉树的基本操作,这里需要通过分析该二叉树基本功能,然后去构造一个类来完成,这部需要使用到上一步中的自定义类型。

二叉树的基本功能包括:

InitBiTree(&T);

操作结果:构造空二叉树T.

DestroyBiTree(&T);

初始条件:二叉树T已经存在.

操作结果:销毁二叉树T.

CreateBiTree(&T,description);

初始条件:给出二叉树的定义.

操作结果:根据description构造二叉树T.

ClearBiTree(&T);

初始条件:二叉树T已经存在.

操作结果:清空二叉树.

IsEmptyBiTree(T);

初始条件:二叉树T已经存在.

操作结果:若T为空二叉树,则返回TRUE;否则返回FALSE.

GetBiTreeDepth(T);

初始条件:二叉树T存在.

操作结果:返回T的深度.

GetBiTreeRoot(T,&&root);

初始条件:二叉树T存在且不为空.

操作结果:返回二叉树T的root根结点.

GetBiTNodeValue(e,&value);

初始条件:结点e存在.

操作结果:返回结点e的data值字段.

AssignBitNode(&e,value);

初始条件:结点e存在.

操作结果:把value的值赋给结点e的data字段.

GetBiTNodeParent(T,e,&parent);

初始条件:二叉树T,结点e存在.

操作结果:若e是T的非根结点,则返回它的双亲,否则返回NULL.

GetBiTNodeLeftChild(e,&lChild);

初始条件:e存在,e是T的某个结点.

操作结果:若e有左孩子,则返回它的左孩子,否则返回NULL.

GetBiTNodeRightChild(e,&rChild);

初始条件:e存在,e是T的某个结点.

操作结果:若e有右孩子,则返回它的右孩子,否则返回NULL.

GetBiTNodeLeftSibling(T,e,&lSibling);

初始条件:二叉树T存在,结点e存在,e是T的结点.

操作结果:返回e的左兄弟,若e无左兄弟,返回NULL.

GetBiTNodeRightSibling(T,e,&rSibling);

初始条件:二叉树T存在,结点e存在,e是T的结点.

操作结果:返回e的右兄弟,若e无右兄弟,返回NULL.

InsertBiTNode(T,p,LR,c);

初始条件:二叉树T,p是指向要插入的结点,LR是左右枚举,c是要插入的结点.

操作结果:根据枚举LR的内容,插入结点e到p所指向的结点下.

DeleteBiTNode(T,p,LR);

初始条件:二叉树T存在,p是指向要删除的结点,LR是左右枚举.

操作结果:根据枚举LR的内容,删除结点e的左/右结点.

PreOrderBiTreeTraverse(&T,visit());

初始条件:二叉树T存在,visit是对结点操作的函数.

操作结果:先序遍历T,对每个结点调用visit函数.

InOrderBiTreeTraverse(&T,visit());

初始条件:二叉树T存在,visit是对结点操作的函数.

操作结果:中序遍历T,对每个结点调用visit函数.

PostOrderBiTreeTraverse(&T,visit());

初始条件:二叉树T存在,visit是对结点操作的函数.

操作结果:后序遍历T,对每个结点调用visit函数.

LevelOrderBiTreeTraverse(&T,visit());

初始条件:二叉树T存在,visit是对结点操作的函数.

操作结果:层序遍历T,对每个结点调用visit函数.

DisplayBiTree(BiTree T);

初始条件:二叉树存在.

操作结果:显示二叉树的内容.

3、 二叉树的遍历(Traversing binary tree)

在二叉树的一些应用中,常常要求在树中查找具有某些特征的结点,或者对树中全部结点逐一进行某种处理。遍历二叉树是二叉树的一种重要的运算。

所谓遍历(Traversal)是指按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。“访问”的含义很广,可以是对结点作可种处理,如输出结点的信息等。

设访问根结点记作 V

遍历根的左子树记作 L

遍历根的右子树记作 R

则可能的遍历次序有

前序 VLR

中序 LVR

后序 LRV

3.1中序遍历(Inorder Traversal)

二叉树算法的定义:

若二叉树为空,则空操作;

否则

中序遍历左子树 (L);

访问根结点 (V);

中序遍历右子树 (R)。

中序遍历二叉树的递归算法

void InOrder ( BinTreeNode *T ) {

if ( T !=

NULL ) {

InOrder ( T->leftChild );

Visit( T->data);

InOrder ( T->rightChild );

}

}

3.2前序遍历(Preorder Traversal)二叉树算法的定义:

若二叉树为空,则空操作;

否则

访问根结点 (V);

前序遍历左子树 (L);

前序遍历右子树 (R)。

前序遍历二叉树的递归算法

void PreOrder ( BinTreeNode *T ) {

if ( T !=

NULL ) {

Visit( T->data);

PreOrder

( T->leftChild );

PreOrder ( T->rightChild );

}

}

3.3后序遍历(Postorder Traversal)二叉树算法的定义:

若二叉树为空,则空操作;

否则

后序遍历左子树 (L);

后序遍历右子树 (R);

访问根结点 (V)。

后序遍历二叉树的递归算法:

void PostOrder ( BinTreeNode * T ) {

if ( T !=

NULL ) {

PostOrder ( T->leftChild );

PostOrder ( T->rightChild );

Visit( T->data);

}

}

4、 二叉树遍历算法的应用举例

我们可以在三种遍历算法的基础上改造完成的其它二叉树算法,如: 求叶子个数,求二叉树结点总数,求度为1或度为2的结点总数,复制二叉树,建立二叉树,交换左右子树,查找值为n的某个指定结点,删除值为n的某个指定结点,等等。

4.1按前序建立二叉树(递归算法)

Status CreateBiTree ( BiTree& T ) {

scanf(&ch);

if (

ch==‘’ ) T=NULL; //读入根结点的值

else{

if ( !(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);

//建立根结点

T->data = ch;

CreateBiTree ( T->leftChild );

CreateBiTree ( T->rightChild );

}

return OK;

}//CreateBiTree

4.2 计算二叉树结点个数(递归算法)

int Count ( BinTreeNode *T ) {

if ( T ==

NULL ) return 0;

else

return 1 + Count ( T->leftChild )

+ Count ( T->rightChild );

}

4.3求二叉树中叶子结点的个数

int Leaf_Count(Bitree T)

{//求二叉树中叶子结点的数目

if(!T) return 0; //空树没有叶子

elseif(!T->lchild&&!T->rchild)

return 1; //叶子结点

else return

Leaf_Count(T-lchild)+Leaf_Count(T-rchild); //左子树的叶子数加上右子树的叶子数

}

4.4 求二叉树高度(递归算法)

int Height ( BinTreeNode * T )

{

if ( T ==

NULL ) return 0;

else {

int m = Height ( T->leftChild );

int n = Height ( T->rightChild ) );

return (m > n) ? m+1 :

n+1;

}

}

4.5 复制二叉树(递归算法)

BiTNode* Copy( BinTreeNode * T )

{

if ( T == NULL ) return NULL;

if(!(Temp=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);

Temp->data=T->data;

Temp-> leftChild = Copy( T->leftChild

);

Temp-> rightChild =

Copy(T->rightChild );

return Temp;

}

4.6 判断二叉树等价(递归算法)

int Equal( BinTreeNode *a, BinTreeNode *b) {

if ( a == NULL && b == NULL )

return 1;

if ( a !== NULL && b !== NULL

&&

a->data==b->data

&& equal(

a->leftChild, b->leftChild)

&& equal(

a->rightChild, b->rightChild) )

return 1;

return

0;//如果a和b的子树不等同,则函数返回0

}

二叉树的遍历也为后面的数据结构:线索二叉树以及线索化后的查找算法,

最优二叉树(哈夫曼树)的概念、构成和应用,树与森林的遍历算法及其与二叉树遍历算法的联系, 树与森林和二叉树的转换做好铺垫。

参考文献:

1 严蔚敏,吴伟民编著《数据结构》。清华大学出版社

2 唐策善,黄刘生编著《数据结构》。中国科学技术大学出版社

谷立东 1967年出生于牡丹江 大学本科

讲师一直从事计算机教学电话:3946366356,gld99@sina.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言编程出彩色告白,C语言告白代码,一闪一闪亮晶晶~

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #define I 20#define R 340int main(){int i,j,e;int a;for(i1,aI;ifor(j(int) ( I-sqrt(I*I-(a-i)*(a-i)) );j>0;j--)printf(" ");for(e1;e<2*sqrt(I*I-(a-i)*(a-i));e)printf("…

计算机二级c语言2021年重点内容,2021年5月计算机二级C语言试题(总)

一个考生的快乐&#xff0c;不是因为他备考的时间多&#xff0c;而是因为他的选择对。选择考无忧题库&#xff0c;做二级C语言试题&#xff0c;助你备考轻松&#xff01;二级C语言试题【1】1.若有以下数组说明&#xff0c;则i10;a[a[i]]元素数值是(C)。int a[12]{1,4,7,10,2,5,…

c语言case key pres,C#程序设计B-中国大学mooc-题库零氪

第2讲 C#语言基础2.1 数据类型、变量与常量 —— 语言中的单词随堂测验1、(加号)可以表示A、算术的加法B、正号C、字符串的连接D、事件的注册()2、int是引用类型3、string是引用类型4、double在内存中占8个字节5、int占2个字节6、Person p1 new Person(18); //Person是引用类型…

c语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归?

bytebuster的解决方案很好&#xff0c;但他没有解释他是如何创建它的&#xff0c;所以它只会帮助解决这个特定的问题。顺便说一句&#xff0c;你的公式看起来有点像斐波纳契(但不完全)&#xff0c;它可以是calculated analytically without any looping(即使没有循环隐藏在Seq.…

android text 字体设置,Android TextView个别字体格式设置小结

android 在同一个TextView中如何展现出不同的字体和颜色总结一下1.主要是痛通过String.xml使用html标签静态配置然后动态引用Html.fromHtml(getResources().getString(R.string.myHeadStr));2.textView 动态设置//创建一个 SpannableString对象 msp new SpannableString("…

android 图片合成pdf文件,教你怎么把多张图片合成一个pdf文件

当你遇到需要把多张图片合并成一个pdf文件时&#xff0c;你需要怎么做?可能有些朋友会说下载一个pdf格式转换工具&#xff0c;其实不必这么麻烦&#xff0c;你只要把文件上传到在线迅捷pdf转换器&#xff0c;就可以一站式帮你搞定pdf文件的格式转换以及一些常用的功能操作(如p…

android中的xml布局文件如何引用另一个xml布局文件,引用另一个layout.xml文件而不复制它...

如果我理解正确提问者对XLARGE和SW-600dp的一个布局文件&#xff0c;另一个用于所有的休息。无论如何&#xff0c;当我偶然发现这个问题时&#xff0c;就是这样。可以通过创建文件夹layout-xlarge和layout-s600dp来解决这个问题&#xff0c;并在每个文件夹中放置一个布局文件&a…

华为系统鸿蒙优势,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪

在华为开发者大会上&#xff0c;华为消费业务CEO 余承东&#xff0c;正式发布鸿蒙OS2.0&#xff0c;并宣布华为鸿蒙OS将全面启用全场景生态&#xff0c;并将于2020年12月发布手机版。余承东还表示&#xff0c;明年&#xff0c;华为的智能手机将全面升级&#xff0c;以支持鸿蒙操…

网页自动关机代码HTML,win10系统打开邮件显示网页html源代码如何解决

有不少win10系统用户在打开邮件的时候&#xff0c;发现内容全是显示网页的html源代码&#xff0c;无法看到内容&#xff0c;遇到这样的问题该怎么办呢&#xff0c;通常是自带的"邮件和日历"应用暂时不支持查看HTML格式的邮件&#xff0c;下面给大家分享一下具体的解决…

android 界面长按,Android 主界面长按创建快捷方式

Android中创建快捷方式主要有两种方式。一是在代码中直接加入生成桌面快捷方式的代码&#xff1b;二是通过小部件加入;这篇文章主要讲另外一种方法&#xff01;1、通过在AndroidManifest文件里为Activity加入加入之后。长按桌面&#xff0c;小部件中会有你应用的图标出现&#…

android+fastboot+命令,Android手机fastboot刷机命令

先进入fastboot文件所在目录连接硬件命令fastboot devices删除recover、boot,system同理Fastboot erase recovery重刷&#xff0c;boot,system同理Fastboot flash recovery cn170.img只需将boot.img和system.img刷入系统即可完成系统的刷新恶补:FASTBOOT命令有加载驱动 | fastb…

retrofit 2.0 android 教程,初识Retrofit2.0

Retrofit无疑是当下最流行的Android网络请求框架了&#xff0c;是Square提供的开源产品。官方网站是这样介绍Retrofit的—-A type-safe HTTP client for Android and Java&#xff0c;为Android平台的应用提供一个类型安全的HTTP客户端。Retrofit 是一套注解形式的网络请求封装…

怎么创建计算机快捷方式到桌面两种方法,使用脚本主机创建Windows快捷方式 - Windows Client | Microsoft Docs...

如何使用脚本宿主创建Windows快捷方式12/03/2020本文内容本文介绍如何通过使用 Microsoft Windows Script Host (WSH) Visual FoxPro 创建桌面快捷方式。适用于&#xff1a; Windows 10 - 所有版本&#xff0c;Windows Server 2012 R2原始 KB 编号&#xff1a; 244677摘要WS…

swagger-ui.html 404,解决访问swagger2报404问题

近来为了项目的接口文档&#xff0c;而集成了swagger2&#xff0c;但是集成完毕后&#xff0c;访问swagger-ui.html却报404&#xff0c;检查后发现&#xff0c;原来是被拦截了。下面写一下我的解决方法。首先新建 WebConfig类实现WebMvcConfigurer接口&#xff0c;WebMvcConfig…

正确使用计算机说课稿,《初识计算机》说课稿

说课稿我说课的题目是《初识计算机》首先说教材&#xff0c;我校信息技术课程没有专用教材&#xff0c;依据柳河县教师进修学校小学三年级信息技术考核标准&#xff0c;我根据大连理工出版社出版的小学信息技术教材内容进行修改之后&#xff0c;用于我校三年级信息技术课程。本…

小学生学计算机编程的必要,小学生学编程,真的那么重要吗

原标题&#xff1a;小学生学编程&#xff0c;真的那么重要吗编程简单的说就是告诉计算机要做什么。人类需要将解决问题的思路、方法和手段通过计算机能够理解的形式告诉计算机&#xff0c;使得计算机能够根据人的指令一步一步去工作&#xff0c;完成某种特定的任务。计算机是迄…

家用计算机机箱怎么选,DIY装机怎么选择电脑机箱 新手必读的电脑主机箱选购指南...

在这个讲究颜值的时代&#xff0c;对于一些主要外观的外观党来说&#xff0c;内外皆修的机箱也是算重要的。DIY装机怎么选择电脑机箱&#xff1f;下面装机之家小编就来谈下新手必读的电脑主机箱选购指南&#xff0c;对于装机选择机箱困难症的朋友不妨来看看。一、首先要明白自己…

计算机启动应用程序的方法,excel的程序_Excel2010中启动应用程序的三种方法

使用Excel时&#xff0c;需要先启动应用程序&#xff0c;怎么去进行操作启动它?今天&#xff0c;学习啦小编就教大家在Excel2010中启动应用程序的三种方法。Excel2010中启动应用程序的三种步骤如下&#xff1a;1.开始菜单在桌面上&#xff0c;单击“开始”&#xff0c;“所有程…

西安工业学院计算机系王翊,西安文理学院艺术学院

“爱的长歌”声乐教学与实践汇报音乐会——王翊师生音乐会圆满结束6月26日我院第八场“爱的长歌”声乐教学与实践汇报音乐会—王翊师生音乐会圆满结束。音乐会受到老师和同学的一致赞誉。整场音乐会高潮迭起&#xff0c;掌声不断。音乐会的学生由16级音乐表演专业的声乐方向的同…

计算机控制系统的稳态误差,计算机控制系统的稳态误差.doc

计算机控制系统的稳态误差计算机控制系统报告--计算机控制系统的稳态误差在计算机控制系统中存在稳态误差。怎样计算稳态误差呢&#xff1f;在连续系统中&#xff0c;稳态误差的计算可以通过两种方法计算&#xff1a;一是建立在拉氏变换中值定理基础上的计算方法&#xff0c;可…