C语言利用二叉树的操作实现根据给定的字符串生成二叉树并前序、中序、后序输出二叉树。
C语言利用二叉树的操作实现根据给定的字符串生成二叉树并前序、中序、后序输出二叉树。
Description
根据给定的字符串生成二叉树并前序、中序、后序此二叉树。
Input
给定一字符串,其中#表示空。
例:上图输入为
HDB#A##C##G#FE###
Output
分别输出此二叉树前序、中序和后序。
Sample Input
HDB#A##C##G#FE###
Sample Output
HDBACGFE BADCHGEF ABCDEFGH
HINT
题目如上关于二叉树的操作,在这里使用二叉树的递归定义来完成这道题
二叉树是n个(n>=0)个节点的有限集合,他要么为空二叉树,要么为一个根节点和两棵互不相交的子树组成。
这两个子树分别叫做左子树和右子树。
那么根据题意和二叉树的定义,我们先定义一个结构体,元素为:char类型的数据,和两个自身类型的指针,左子树指针,和右子树指针。
#include<stdio.h>
typedef struct node{char data;struct node *lChild, *rChild;
}BinTree;
想要对二叉树进行相应的操作,就得先拥有一个二叉树,里面存放我们想要的数据。
那么创建一个二叉树的构建函数。
BinTree* CreateBinTree(){BinTree* bt = NULL;char s;scanf("%c",&s);if(s=='#'){bt = NULL;}else{bt = (BinTree*)malloc(sizeof(BinTree));bt->data = s;bt->lChild = CreateBinTree();bt->rChild = CreateBinTree();}return bt;
}
当某个子树没有数据的时候,我们使用#来代表这个节点的这个子树没有数据。bt=NULL会返回给上一层递归调用的函数。
接下来就是按照先序,中序,后序的顺序进行输出。其实了解二叉树的这些遍历顺序就知道。
所谓的先序,中序,后序,无非就是遍历的时候访问父节点和左子树节点、右子树节点的顺序不同。导致递归函数被调用的先后顺序不同。理解这三个顺序中的一个,其余的也就都能理解出来。
先序,中序,后序代码如下:
void PreOrder(BinTree* bt)
{if(bt!=NULL){printf("%c",bt->data);PreOrder(bt->lChild);PreOrder(bt->rChild);}
}
void PostOrder(BinTree* bt)
{if(bt!=NULL){PostOrder(bt->lChild);PostOrder(bt->rChild);printf("%c",bt->data);}
}
void InOrder(BinTree* bt)
{if(bt!=NULL){InOrder(bt->lChild);printf("%c",bt->data);InOrder(bt->rChild);}
}
上面就是这些所有的函数,包括按照三种顺序遍历,和生成二叉树的函数,全部代码如下:
#include<stdio.h>
typedef struct node{char data;struct node *lChild, *rChild;
}BinTree;BinTree* CreateBinTree(){BinTree* bt = NULL;char s;scanf("%c",&s);if(s=='#'){bt = NULL;}else{bt = (BinTree*)malloc(sizeof(BinTree));bt->data = s;bt->lChild = CreateBinTree();bt->rChild = CreateBinTree();}return bt;
}
void PreOrder(BinTree* bt)
{if(bt!=NULL){printf("%c",bt->data);PreOrder(bt->lChild);PreOrder(bt->rChild);}
}
void PostOrder(BinTree* bt)
{if(bt!=NULL){PostOrder(bt->lChild);PostOrder(bt->rChild);printf("%c",bt->data);}
}
void InOrder(BinTree* bt)
{if(bt!=NULL){InOrder(bt->lChild);printf("%c",bt->data);InOrder(bt->rChild);}
} int main(){BinTree *p=NULL;p = CreateBinTree();PreOrder(p);printf("\n");InOrder(p);printf("\n");PostOrder(p);return 0;
}
C语言利用二叉树的操作实现根据给定的字符串生成二叉树并前序、中序、后序输出二叉树。相关推荐
- 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...
- 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...
- 先序中序后序两两结合重建二叉树
遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次.由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转 ...
- java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...
224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...
- 序列化和反序列化二叉树 -----前序,中序,后序,层序
目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码 ...
- 二叉树的前、中、后序遍历
所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次.访问结点所做的操作依赖于具体的应用问题. 遍历是二叉树上最重要的运算之一,也是二叉树进行其它运算的基础. 二 ...
- 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法
本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...
- 二叉树遍历(递归实现前序/中序/后序遍历)
1. 准备工作 我们先定义一棵普通的二叉树,如下图 2. 前序遍历 通过递归进行遍历: 如果二叉树为空,则操作返回: 如果非空,否则从根结点开始,然后遍历左子树,再遍历右子树. 前序遍历的结果是:AB ...
- 二叉树遍历方法——前、中、后序遍历(图解)
目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...
最新文章
- php 的webservice类库NuSoap介绍
- leetcode 349. 两个数组的交集 两种方案,c语言实现
- 北斗导航 | 自主无人系统多传感器融合技术(学术PPT分享附视频链接)
- Service Request Account field in CRM and C4C
- java replaceall 大小写_Java replaceAll不区分大小写
- 高版本号chrome安装flashplayer debuger后无法使用的问题
- 数据产品-数据指标标签常用sql函数
- java 中的jframe_java中JFrame是什么
- SQLi LABS Less 27 联合注入+报错注入+布尔盲注+时间盲注
- LYNC功能之呼叫合并
- 卧槽,又来一个 Java 神器!!
- 【转】高性能web开发
- Java-注解第一篇认识Annotation
- SSM框架整合及详解
- PCB焊接——原理篇
- 计网笔记-计网总结-计网复习提纲-第一章.概述
- upc组队训练第十九场
- 信息系统项目管理(五)信息系统安全技术
- 415报错,两种解决方法
- 软件工程案例教程答案(第三版)韩万江 姜立新 编著 课后题答案 (软件项目开发实践)