c语言_二叉树的建立以及3种递归
二叉树c语言的实现
二叉树的建立
二叉树的数据结构
typedef struct node
{
int data;
struct node* left;
struct node* right;
/* data */
} Node;简单创建节点

int main() {
Node n1;
Node n2;
Node n3;
Node n4;
n1.data = 5;
n2.data = 6;
n3.data = 7;
n4.data = 8;
//这时候节点没有连接起来 对节点进行连接
n1.left = &n2; //n2是一个数据实体 而left需要是一个指针 取n2的地址拼到n1的左边上去
n1.right = &n3;
n2.left = &n4;
n2.right = NULL; //即使没东西也要 给出NULL
n3.left = NULL;
n3.right = NULL;
n4.left = NULL;
n4.right = NULL;
//创建成功
//先序遍历验证
preorder(&n1);//放入一个指针地址 作为头节点
}通过遍历树来确认是否是一个真正的二叉树
//先序遍历 递归
void preorder(Node* node){
if(node != NULL){
printf("%d\n",node -> data);
preorder(node -> left);
preorder(node -> right);
}
}
输出结果

中序和后续遍历
//中序遍历 递归
void inorder(Node* node){
if(node != NULL){
inorder(node -> left);
printf("%d\n",node -> data);
inorder(node -> right);
}
}
//后序遍历 递归
void postorder(Node* node){
if(node != NULL){
postorder(node -> left);
postorder(node -> right);
printf("%d\n",node -> data);
}
}改写创建树的代码
void createBiTree(BiTree *T)
{
char ch;
scanf ("%c", &ch); //如果是字符型 %c 回车输入 算一个字符,ubutun会一直递归
if (ch == '#')//扩展二叉树,虚结点 == 0
{
*T = NULL;
}
else
{
*T = (BiTree )malloc(sizeof(BiTNode)); //!!! stdlib.h 头文件一定要加!!!
if (!*T)
{
exit(-1); //错误退出
}
(*T)->data = ch; //生成根结点
createBiTree(&((*T)->lchild)); //构造左子树
createBiTree(&((*T)->rchild)); //构造右子树
}
}最终代码
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType; //这里用int 作为树结点的数据
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;
void createBiTree(BiTree *T); //创建树
void preOrderTraverse(BiTree T); //前序遍历
void inOrderTraverse(BiTree T); //中序遍历
void postOrderTraverse(BiTree T); //后序遍历
int main()
{
BiTree T = NULL;
createBiTree(&T);
preOrderTraverse(T);
printf("\n");
inOrderTraverse(T);
printf("\n");
postOrderTraverse(T);
return 0;
}
void createBiTree(BiTree *T)
{
char ch;
scanf ("%c", &ch); //如果是字符型 %c 回车输入 算一个字符,ubutun会一直递归
if (ch == '#')//扩展二叉树,虚结点 == 0
{
*T = NULL;
}
else
{
*T = (BiTree )malloc(sizeof(BiTNode)); //!!! stdlib.h 头文件一定要加!!!
if (!*T)
{
exit(-1); //错误退出
}
(*T)->data = ch; //生成根结点
createBiTree(&((*T)->lchild)); //构造左子树
createBiTree(&((*T)->rchild)); //构造右子树
}
}
void preOrderTraverse(BiTree T)
{
if (NULL == T)
{
return;
}
printf("%c", T->data); //显示结点数据,可以改成其他对结点的操作
preOrderTraverse(T->lchild); //再先序遍历左子树
preOrderTraverse(T->rchild); //最后先序遍历右子树
}
void inOrderTraverse(BiTree T)
{
if (NULL == T)
{
return;
}
inOrderTraverse(T->lchild); //中序遍历左子树
printf("%c", T->data); //显示结点数据,可以改成其他对结点的操作
inOrderTraverse(T->rchild); //最后再中序遍历右子树
}
void postOrderTraverse(BiTree T)
{
if (NULL == T)
{
return;
}
postOrderTraverse(T->lchild); //先后序遍历左子树
postOrderTraverse(T->rchild); //再后序遍历右子树
printf("%c", T->data); //显示结点数据,可以改成其他对结点的操作
}
输入数据
ABDG##H###CE#I##F##
输出数据

c语言_二叉树的建立以及3种递归的更多相关文章
- C语言实现二叉树的建立、遍历以及表达式的计算
实现代码 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <ctype ...
- 数据结构_C语言_二叉树先序、中序、后序遍历
# include <stdio.h> # include <stdlib.h> typedef struct BiTreeNode { char data; struct B ...
- C语言_指针和数组的几种访问形式
敲几行代码来看看几种访问的形式~ #include <stdio.h>;int main() { ] = {, , , , , }; //初始化5个元素的一维数组 int *p = arr ...
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
#-*- coding:utf-8 -*- class Node: def __init__(self,data): self.data=data self.lchild=None self.rchi ...
- 一步一步写数据结构(二叉树的建立和遍历,c++)
简述: 二叉树是十分重要的数据结构,主要用来存放数据,并且方便查找等操作,在很多地方有广泛的应用. 二叉树有很多种类,比如线索二叉树,二叉排序树,平衡二叉树等,本文写的是最基础最简单的二叉树. 思路: ...
- C语言二叉树的建立与遍历
二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...
- 二叉树的建立与遍历(c语言)入门
树其实在本质上就是一对多,链表就是一对一. 二叉树的建立: 这里的代码采用的是最粗暴的创建方法,无实际用处.但初次学习二叉树可以通过这个创建方法更好的理解二叉树. 二叉树的遍历: 遍历在大体上分为递归 ...
- 3.1 C语言_实现AVL平衡二叉树
[序] 上节我们实现了数据结构中最简单的Vector,那么来到第三章,我们需要实现一个Set set的特点是 内部有序且有唯一元素值:同时各种操作的期望操作时间复杂度在O(n·logn): 那么标准的 ...
- 怎样让Oracle支持中文? 语言_地域.字符集
暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区 作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...
随机推荐
- 敲了几万行源码后,我给Mybatis画了张“全地图”
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.说说:"产"后感受 有人跟我说,手写Spring难,手写Mybatis ...
- 左右手切换工具xmouse v1.2版本发布
Xmouse 方便的切换鼠标左右键,因为功能非常简单,所以支持.net framework 2.0及以上 windows环境就可以了,目前已测试win7.win10可用. 关于为什么做这么个东西,那是 ...
- Python爬虫-正则
介绍: 是 一门全新的语言,一种使用表达式的方式对字符串进行匹配的语法规则 我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再适合不过 优点:速度快.效率高.准确性高 缺点: ...
- WPF开发随笔收录-自定义图标控件
一.前言 1.在以前自学的过程中,软件需要使用到图标的时候,总是第一个想法是下载一个图片来充当图标使用,但实际得出来的效果会出现模糊的现象.后来网上学习了字体图标库的用法,可以在阿里云矢量图网站那里将 ...
- RPA微信机器人汇总
一.微信广告PDF对账单数据提取机器人 [机器人详情] 微信广告对账结算单为PDF文件,从每一期对账单文件中提取结算数据,统计成excel表格,便于与腾讯广告业务结算审核 [机器人步骤] 1.启动机器 ...
- pop!_OS换国内源
今天给电脑换源了,虽然本来的源大部分好像也都连的上(不知道是不是错觉)换的这个:阿里云镜像开源站 先进入存放源的目录:` cd /etc/apt 里面有这些文件: sources.list是要修改的, ...
- 意想不到的Python ttkbootstrap 制作账户注册信息界面
嗨害大家好,我是小熊猫 今天给大家来整一个旧活~ 前言 ttkbootstrap 是一个基于 tkinter 的界面美化库,使用这个工具可以开发出类似前端 bootstrap 风格的tkinter 桌 ...
- 面试突击65:为什么要用HTTPS?它有什么优点?
说到 HTTPS 相信大部分人都是不陌生,因为目前我们使用的绝大数网站都是基于 HTTPS 的,比如以下这些: 那么问题来了,他们为什么要使用 HTTPS 呢?HTTPS 有哪些过人之处呢? 1.HT ...
- 从零开始实现lmax-Disruptor队列(五)Disruptor DSL风格API原理解析
MyDisruptor V5版本介绍 在v4版本的MyDisruptor实现多线程生产者后.按照计划,v5版本的MyDisruptor需要支持更便于用户使用的DSL风格的API. 由于该文属于系列博客 ...
- 互联网产品前后端分离测试(Eolink 分享)
在互联网产品质量保障精细化的大背景下,根据系统架构从底层通过技术手段发起测试,显得尤为重要,测试分层的思想正是基于此产生的,目前也是较为成熟的测试策略. 一般采用自下而上的测试方式,以最简单的单一前后 ...