C语言创建二叉树的方法(全)
创建二叉树
- 前言
- 一、二叉树的链式储存
- 二、前序,中序,后序
- 中序和先序建立二叉树
- #号法创建二叉树
前言
一、二叉树的链式储存
typedef struct BitNode
{char data;struct BitNode* lchild, * rchild;
}BitNode, * BiTree;
//BiTree 相当于 struct BitNode * BiTree;
二、前序,中序,后序
前序:先访问树的根节点然后是左子树,最后是右子树。
中序:先访问树的左子树,然后是根节点,最后是右子树。
后序:先访问树的左子树,然后右子树,最后是根节点,。
中序和先序建立二叉树
为什么一种遍历方法不能建立,相信大家都懂了。
思路:(1)通过先序遍历找到根结点,再通过根结点在中序遍历的位置找出左子树、右子树。(2)根据左子树在先序遍历结果的顺序,找到左子树的根结点,视左子树为一棵独立的树,转步骤(1)。(3)根据右子树在先序遍历结果的顺序,找到右子树的根结点,视右子树为一棵独立的树,转步骤(1)。
void BuildTree(BiTree & T, char* pre_str, char* in_str, int L1, int R1, int L2, int R2)
{T = (BitNode*)malloc(sizeof(BitNode));//申请一个节点T->data = pre_str[L1];//判断用中序,赋值用先序int in_root = 0;for (int i = L2; i <= R2; i++)//找出中序遍历中根节点的位置{if (pre_str[L1] == in_str[i]){in_root = i;break;}}if (in_root - L2 != 0)//判断中序序列左边是否存在子序列{//递归构建左子树,包含两个区间,分别为前序、中序序列的左子树区间BuildTree(T->lchild, pre_str, in_str, L1 + 1, L1 + in_root - L2, L2, in_root - 1);}elseT->lchild = NULL;//没有的话置为空if (R2 - in_root != 0)//判断中序序列右边是否存在子序列{//递归构建右子树,包含两个区间,分别为前序、中序序列的右子树区间BuildTree(T->rchild, pre_str, in_str, R1 - (R2 - in_root) + 1, R1, in_root + 1, R2);}elseT->rchild = NULL;}int main()
{char pre[100], in[100];printf_s("请输入先序:");scanf_s("%s", pre,100);printf_s("请输入中序:");scanf_s("%s", in,100);BiTree T = NULL;int len1 = strlen(pre), len2 = strlen(in);BuildTree(T, pre, in, 0, len1 - 1, 0, len2 - 1);lastOrder(T);return 0;
}
先序:ADEBCF
中序:DEACFB
//递归构建左子树,包含两个区间,分别为前序、中序序列的左子树区间
BuildTree(T->lchild, pre_str, in_str, L1 + 1, L1 + in_root - L2, L2, in_root - 1);
A为根节点,由中序知道DE为左子树,L1 + 1为先序中的D,L1 + in_root - L2为先序中的E,in_root - 1为中序中的E同理可以知道左子树中参数的意义
#号法创建二叉树
只能用先序建立
BiTree creat_Tree()
{BiTree T = NULL;char ch;scanf_s("%c", &ch);if (ch == '#'){T = NULL;//说明该元素无效return T;}else{T = (BitNode*)malloc(sizeof(BitNode));if (T == NULL)//递归结束标识return NULL;T->data = ch;T->lchild = NULL;//先置空T->rchild = NULL;T->lchild = creat_Tree();T->rchild = creat_Tree();return T;}
}
C语言创建二叉树的方法(全)相关推荐
- 先根序列创建二叉树c语言,用C语言创建二叉树并先序遍历.doc
用C语言创建二叉树并先序遍历 用C语言创建二叉树并 #include "stdio.h" #include "stdlib.h" typedef struct ...
- R语言创建新变量方法
R语言创建新变量方法 在数据分析中,可能需要对数据进行求和.求均值等处理,并且将处理后的数据重新保存到原来的数据框中,这里提供三种可供解决的方法: 数据框$变量名 <- 表达式.若原数据框中含有 ...
- 用JAVA语言创建链表的方法
链表刚学习时是用c来学习的,那时候对于结构体,指针这些东西实现链表觉得很合适,但想要应用到java上还是有些不同的 这里,我学习下用java来使用链表的方法: 首先,定义节点类 //链表节点 clas ...
- c语言二叉树的生成,C语言实现二叉树的创建以及遍历(递归)
C语言实现二叉树的创建以及遍历 #include typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNo ...
- 基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用
Meta分析是针对某一科研问题,根据明确的搜索策略.选择筛选文献标准.采用严格的评价方法,对来源不同的研究成果进行收集.合并及定量统计分析的方法,最早出现于"循证医学",现已广泛应 ...
- c语言线程的创建步骤,C语言创建线程thread_create()的方法
在头文件 threads.h 中,定义和声明了支持多线程的宏.类型和函数.所有直接与线程相关的标识符,均以前缀 thrd_ 作为开头.例如,thrd_t 是一个对象类型,它标识了一个线程. 函数 th ...
- 用c语言构建二叉树(重点)
结点创建 二叉树创建 我们以'#'为NULL,我们要把输入进来的一个字符串转变为二叉树,所以我们要记住递归的每一步走到数组了哪个位置 所以我们要记住创建过程中用掉的前序个数,并返回,除此之外,还要加上 ...
- php c扩展的方式,php中使用C语言写扩展的方法
php中使用C语言写扩展的方法 发布时间:2020-08-20 15:49:21 来源:亿速云 阅读:102 作者:小新 小编给大家分享一下php中使用C语言写扩展的方法,相信大部分人都还不怎么了解, ...
- C语言二叉树字符统计,C语言实现二叉树-利用二叉树统计单词数目
昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以 ...
最新文章
- js时间戳格式化成日期格式
- Nacos-Nacos和Eureka的对比
- eclipse环境配置、快捷键及基本操作
- No Identifier specified for entity的解决办法
- Typecho 支持黑暗模式的后台主题插件
- 二分法08:寻找旋转排序数组中的最小值
- numpy与tensorflow中的广播(broadcast)机制
- 便携式嵌入式软件接口测试工具
- matlab u 上波浪线,波浪线如何居中,在excel中怎样输入在文字中部加波浪线
- CCF小白刷题之路---201809-1 卖菜(C/C++ 100分)
- gii无法访问 yii2_Gii的CURD生成无法访问?
- 为什么说每个软件工程师,都该懂大数据技术?
- docker 的具名挂载与匿名挂载
- 如何读到一个文件的最后更新日期和时间
- 打印Service运行时间与Aspect相关注解使用
- 如何在Apple Watch上获取行车路线
- 密码算法测试向量——HMAC-SHA系列
- 各种效应:蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则、手表定律、破窗理论、二八定律、木桶理论、马太效应
- 自制ip地址切换器ip.dat
- 往事如烟 - 笑傲江湖
热门文章
- ear包目录_Java中的JAR/EAR/WAR包的文件夹结构说明(转)
- 如何在jupyter notebook中运行markdown文件(脚本、代码)
- python 虚拟环境 virtualenv virtualenvwrapper的使用方法、命令
- 【car】为什么后轮驱动的电动小摩托后轮打滑时制动前轮能起到较好的防打滑效果(ESC、ESP、VSA车身稳定系统)
- numba.jit警告:warnings.warn(errors.NumbaDeprecationWarning(msg, state.func_ir.loc))
- LNMP架构环境搭建之PHP、Nginx源码编译安装及其简单配置应用
- linux——samba共享以及基础用法
- Java进阶:default方法说明
- docker安装kibana7.6.1
- JDK/Dubbo/Spring 三种 SPI 机制,谁更好呢?