用c语言实现前序创建二叉树(递归),分别用前序,中序,后序遍历,以及分别输出节点个数和叶子节点个数
本人c语言小白一枚,近期在学习数据结构(c语言版),特写此随笔,做一些总结和分享,如有不当之处,请各位技术大牛斧正
首先我们用一个结构体来抽象树的结点,代码如下(这里我们存放的数据为char型,大家可以根据自己不同的数据来自己定义,也可以在一开始用typedf特别定义一个类型,接下来就是两个指针,
用来指向左儿子和右儿子)
struct tnode{
char data;
struct tnode *lchild,*rchild;
};
一,如何前序创建一颗二叉树
首先简述一下前序创建二叉树的算法:其实前序创建一颗二叉树的算法非常简单,这里我们要用到递归的思想,先给根节点赋值,然后再依次给左子树的根节点和右子树的根节点赋值,用递归的思想将整颗树赋值。(在这里我们用‘#’来表示某个结点为空),代码如下:
struct tnode * creatTree(struct tnode *head){
char e;
scanf("%c",&e);
fflush(stdin);
if(e != '#'){
head = (struct tnode *)malloc(sizeof(struct tnode));//先开辟空间
head ->data = e;//判断不是'#'后,给根节点赋值
head ->lchild = NULL;
head ->rchild = NULL; //依次把左儿子和右儿子调用该方法进行赋值
head ->lchild = creatTree(head->lchild);
head ->rchild = creatTree(head->rchild);
}
return head;
}
这样我们就可以成功创建一颗二叉树
二,前序遍历二叉树
简述一下前序遍历二叉树的算法:(这里同样也要用到递归的思想),首先拜访头结点,然后拜访左子树,再拜访右子树,代码如下:
void preorderTree(struct tnode *head){
//先拜访头结点
printf("%c",head->data);
//再走左子树
if(head->lchild != NULL){//判断左子树是不是为空
preorderTree(head->lchild);
}
if(head ->rchild !=NULL){//判断右子树是不是为空
//再走右子树
preorderTree(head->rchild);
}
return;
}
三,后序遍历二叉树:和前序遍历二叉树类似,只是我们要最后拜访根节点,同样用到了递归的思想,代码如下:
void postorderTree(struct tnode *head){
//先左子树
if(head->lchild != NULL){
postorderTree(head->lchild);
}
//再右子树
if(head->rchild != NULL){
postorderTree(head->rchild);
}
//最后根节点
printf("%c",head->data);
return;
}
四,中序遍历二叉树:和前两种类似,我们先拜访左子树,再拜访根节点,最后拜访右子树,(同样用到了递归的思想)代码如下:
void inorderTree(struct tnode *head){
//先走头结点
printf("%c",head->data);
//再走左子树
if(head->lchild !=NULL){
inorderTree(head->lchild);
}
//再走右子树
if(head->rchild != NULL){
inorderTree(head->rchild);
}
return;
}
五,输出节点的个数
思路:我们先在main函数里面定义一个计数器,在遍历的过程中,只要节点不是null,我们就让这个计数器++,这样就可以实现记录节点个数的功能啦,(在这里我们同样又用到了递归的思想,递归真的好重要的,到处都是递归),代码如下:(这里特别要注意的地方就是我们在main函数里面定义的计数器,一定要把地址给我们的函数,所以我们函数里面的形参是个int型的指针)
int sumNode(struct tnode *head,int *count){
if(head == NULL){//判断根节点是否为空
;
}else{
//在这里我们用的是前序遍历二叉树的思想,先走根节点,在走左右子树
*count += ;
sumNode(head->lchild,count);
sumNode(head->rchild,count);
}
return *count;
}
六,输出叶子节点的个数
简单思路:其实这个和上面输出节点的思路差不多,只不过我们要加一个判断条件,就是判断该结点是否为叶子节点,判断条件也很简单,只要看它的左右子树是否为空就好了,(同样也是用到了递归的思路)代码如下:
int numberLeafNode(struct tnode *head,int *countln){
if(head->lchild == NULL&&head->rchild == NULL){//判断是否为叶子节点
;
}else{//如果不是叶子节点的话,就去看它的左右子树是不是叶子节点
if(head->lchild != NULL){
numberLeafNode(head->lchild,countln);
}
if(head->rchild != NULL){
numberLeafNode(head->rchild,countln);
}
}
}
以上就是全部内容,如有疑问和您的宝贵建议,尽情可以在评论中留言
用c语言实现前序创建二叉树(递归),分别用前序,中序,后序遍历,以及分别输出节点个数和叶子节点个数的更多相关文章
- c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...
- 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)
Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...
- 前序+中序->后序 中序+后序->前序
前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...
- SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
原文:在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...
- 【11】-java递归和非递归二叉树前序中序后序遍历
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...
随机推荐
- Java8新特性——接口默认方法
Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个default关键字即可实现默认方法. 为什么要有这个特性? 首先 ...
- Shell之StdI/O和Pipe
目录 Shell之StdI/O和Pipe 参考 StdI/O重定向 Pipe 常用组合 Shell之StdI/O和Pipe
- Mybatis-Plus学习.,简化你的开发,提升开发效率.
Mybatis-Plus学习以及实践 简介 参考网址 开发环境 开始开发 - 配置pom.xml - Dao/Service/Entity - 基本方法 - 查询类 - 更新类 分页插件 - pom. ...
- Python3 Linux安装(Redhat)
Python3 Linux安装(Redhat): 下载Python-3.6.4.tgz: https://www.python.org/downloads/release/python-364/ Y ...
- python串口助手
最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试. 在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口 ...
- 《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)
6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Expres ...
- BUUCTF刷题记录(Web方面)
WarmUp 首先查看源码,发现有source.php,跟进看看,发现了一堆代码 这个原本是phpmyadmin任意文件包含漏洞,这里面只不过是换汤不换药. 有兴趣的可以看一下之前我做的分析,http ...
- Node.js入门教程 第六篇 (连接使用MySql)
连接使用MySql 安装MySql模块: npm install mysql 创建连接: const mysql = require('mysql') // 连接 mysql 服务器 const co ...
- System NT Kernel & System占用CPU 12%左右 终极解决方案,原来是更新惹的祸
任务管理器发现 system进程持续占用12%左右的cpu,网上搜索到的很多方法均无效 误打误撞发现了这个方法,亲测可用 卸载系统补丁(KB41000347),提升10%的cpu性能 卸载补丁前: ...
- docker的使用之镜像命令
说明 Docker运行容器前需要本地存在对应的镜像 ,如果镜像不存在本地,Docker会从镜像仓库下载 获取镜像 通过网址可以找到目标镜像 https://hub.docker.com/explore ...