c语言创建字符树,使用C语言构建基本的二叉树数据结构

二叉树结构常用的一些初始化代码

#include

#include

typedef struct Node{

int data;

Node *leftchild;

Node *rightchild;

}Node;

/*

初始化一棵二叉树排序树。

*/

void InitBinaryTree(Node**root,int elem)

{

*root=(Node*)malloc(sizeof(Node));

if(!(*root))

{

printf("Memory allocation for root failed.\n");

return;

}

(*root)->data=elem;

(*root)->leftchild=NULL;

(*root)->rightchild=NULL;

}

/*

向二叉树排序树中插入节点。

*/

void InsertNode(Node *root,int elem)

{

Node *newnode=NULL;

Node *p=root,*last_p=NULL;

newnode=(Node*)malloc(sizeof(Node));

if(!newnode)

{

printf("Memory allocation for newnode failed.\n");

return;

}

newnode->data=elem;

newnode->leftchild=NULL;

newnode->rightchild=NULL;

while(NULL!=p)

{

last_p=p;

if(newnode->datadata)

{

p=p->leftchild;

}

else if(newnode->data>p->data)

{

p=p->rightchild;

}

else

{

printf("Node to be inserted has existed.\n");

free(newnode);

return;

}

}

p=last_p;

if(newnode->datadata)

{

p->leftchild=newnode;

}

else

{

p->rightchild=newnode;

}

}

/*

创建一棵二叉树排序树。

*/

void CreatBinarySearchTree(Node **root,int data[],int num)

{

int i;

for(i=0;i

{

if(NULL==*root)

{

InitBinaryTree(root,data[i]);

}

else

{

InsertNode(*root,data[i]);

}

}

}

根据前序序列、中序序列构建二叉树函数定义

bt rebuildTree(char *pre, char *in, int len);

参数:

* pre:前序遍历结果的字符串数组

* in:中序遍历结果的字符串数组

len : 树的长度

例如:

前序遍历结果: a b c d e f g h

中序遍历结果: c b e d f a g h

算法思想

递归思想,递归的终止条件是树的长度len == 0

在中序遍历的数组中找到前序数组的第一个字符,记录在中序数组中的位置index.如果找不到,说明前序遍历数组和中序遍历数组有问题,提示错误信息,退出程序即可;找到index后,新建一个二叉树节点t,t->item = *pre,然后递归的求t的左孩子和有孩子

递归的左孩子:void rebuildTree(pre + 1, in, index)

递归的右孩子:void rebuildTree(pre + (index + 1), in + (index + 1), len - (index + 1))

实现代码(c语言版)

/**

* Description:根据前序和中序构建二叉树

*/

bt rebuildTree(char *pre, char *in, int len)

{

bt t;

if(len <= 0)

{

//递归终止

t = NULL;

}else

{

//递归主体

int index = 0;

while(index < len && *(pre) != *(in + index))

{

index ++;

}

if(index >= len)

{

printf("前序遍历或者中序遍历数组有问题!\n");

exit(-1);

}

t = (struct bintree *)malloc(sizeof(struct bintree));

t->item = *pre;

t->lchild = rebuildTree(pre + 1, in, index);

t->rchild = rebuildTree(pre + (index + 1), in + (index + 1), len - (index + 1));

}

return t;

}

根据中序序列、后序序列构建二叉树函数定义

/**

* 中序、后序序列构建二叉树

*/

btree* rebuildTree(char *order, char *post, int len);

算法思想

中序序列:C、B、E、D、F、A、H、G、J、I

后序序列:C、E、F、D、B、H、J、I、G、A

递归思路:

根据后序遍历的特点,知道后序遍历最后一个节点为根节点,即为A

观察中序遍历,A左侧CBEDF为A左子树节点,A后侧HGJI为A右子树节点

然后递归的构建A的左子树和后子树

实现代码(c代码)

/**

* 根据中序和后序序列构建二叉树

* (ps:昨晚参加阿里笔试,等到最后说可以免笔试直接面试,今天估计还是要根据学校筛选,哈哈,为了这点

* 也得参加阿里笔试,不能让自己的学校受到鄙视)

*/

#include

#include

#include

int n;

typedef struct btree {

struct btree *lchild;

struct btree *rchild;

char data;

} btree;

/**

* 中序、后序序列构建二叉树

*/

btree* rebuildTree(char *order, char *post, int len)

{

btree *t;

if (len <= 0) {

return NULL;

} else {

int index = 0;

while (index < len && *(post + len - 1) != *(order + index)) {

index ++;

}

t = (btree *)malloc(sizeof(btree));

t->data = *(order + index);

t->lchild = rebuildTree(order, post, index);

t->rchild = rebuildTree(order + index + 1, post + index, len - (index + 1));

}

return t;

}

/**

* 前序遍历二叉树

*/

void preTraverse(btree *t)

{

if (t) {

printf("%c ", t->data);

preTraverse(t->lchild);

preTraverse(t->rchild);

}

}

int main(void)

{

int i;

char *post, *order;

btree *t;

while (scanf("%d", &n) != EOF) {

post = (char *)malloc(n);

order = (char *)malloc(n);

getchar();

for (i = 0; i < n; i ++)

scanf("%c", order + i);

getchar();

for (i = 0; i < n; i ++)

scanf("%c", post + i);

t = rebuildTree(order, post, n);

preTraverse(t);

printf("\n");

free(post);

free(order);

}

return 0;

}

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

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

相关文章

可变lambda_Lambda的Lambda(如果可选)

可变lambda因此&#xff0c;我对JDK 8中Optional接口的两个限制感到沮丧。第一个问题是&#xff0c;没有明显的方法可以在块中执行else操作&#xff0c;因为只有isPresent方法&#xff0c;除非您使用的是老式的if语句。 第二个问题当然是古老的板栗&#xff0c;即使您能够做到&…

【WebRTC---入门篇】(四)WebRTC设备管理

enumerateDevices API用来获取音视频设备 JS使用单线程处理&#xff0c;为了避免阻塞。使用异步调用Promise。handle为处理函数&#xff0c;处理主要逻辑。成功调用resolve&#xff1b;失败调用reject。Promise可以注册两个方法 then(逻辑处理成功会收到on_resolve) 和 catch(…

n阶幻方c语言编程,求单偶阶与双偶阶幻方编程思想及其算法!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #define N 100void oujie(int oushu){int a[N][N]{0},i,j,k1,n,m;noushu/2;m(oushu-2)/4;for(i1,j3*n/2;k<n*n;){if(i<0){ ii3*n; continue; }if(j>3*n){ jj-3*n; continue; }if(j<0){ jj3*n; continue; }if(…

python函数结构_PYTHON 之结构体,全局变量,函数参数,lambda编程 等

PYTHON 之结构体,全局变量,函数参数,lambda编程 ,generator&#xff08;yield&#xff09;使用以及如何自己构建switch结构 *********************** pass pass可以模拟struct结构 class Data pass d Data() d.a 2 d.b 4 print d.a print d.b *********************** 子函数…

【音视频安卓开发 (六)】Android GLSurfaceView播放视频

GLSurfaceView渲染RGB的数据,利用双缓冲空间机制。取出缓冲地址,将要渲染的数据copy到缓冲地址. 获取Surface Java部分&#xff1a; SurfaceView控件设置到界面中显示 SurfaceView定义一个类来实现 package com.example.hello;import android.content.Context; import android…

什么是openstack_您在OpenStack Summit 2016上错过了什么

什么是openstack今年&#xff0c;我第一次参加了4月25日至29日在德克萨斯州奥斯汀举行的OpenStack峰会。 今天结束了&#xff0c;我要回家了&#xff0c;我想回顾一下&#xff0c;从我的角度分享你错过的事情。 作为以应用程序开发人员为重点的技术传播者&#xff0c;转移到包…

python链表实现栈_使用python实现数组、链表、队列、栈

引言 什么是数据结构&#xff1f; 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说&#xff0c;数据结构就是设计数据以何种方式组织并存储在计算机中。 比如&#xff1a;列表&#xff0c;集合和字典等都是数据结构 N.W…

笛卡尔乘积c语言代码,c# – 高效笛卡尔乘积算法

有人可以向我证明比目前使用的笛卡儿乘积算法更有效(假设有一个)。我已经看了周围的SO和谷歌&#xff0c;但看不到任何明显的东西&#xff0c;所以我可能会缺少一些东西。foreach (int i in is) {foreach (int j in js) {//Pair i and j}}这是我在代码中做的非常简化的版本。两…

【音视频安卓开发 (七)】安卓视频播放窗口去掉标题栏、全屏、横屏

java中的MainActivity初始化部分设置这些操作 //去掉标题栏supportRequestWindowFeature( Window.FEATURE_NO_TITLE);//全屏&#xff0c;隐藏状态getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN ,WindowManager.LayoutParams.FLAG_FULLSCREEN);//屏幕为横屏…

drools6.5_Drools 6.4.0.Final提供

drools6.5最新和最出色的Drools 6.4.0.Final版本现已可供下载。 这是我们先前构建的增量版本&#xff0c;对核心引擎和Web工作台进行了一些改进。 您可以在此处找到更多详细信息&#xff0c;下载和文档&#xff1a; Drools网站 资料下载 文献资料 发行说明 请阅读下面的…

python 统计组合用什么库_Python机器学习需要用到的库

www.oldboyedu.com 老男孩 IT 教育&#xff0c;只培养技术精英 Python 机器学习需要用到的库 Python 是一种面向对象的解释型计算机程序设计语言&#xff0c;具有丰富和强大的 库&#xff0c;再加上其简单、易学、速度快、开源免费、可移植性、可扩展性以及面向对 象的特点&…

c语言编程数学黑洞,一个数学黑洞——6174

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*问题描述&#xff1a;从0-9中任意选取4个不完全相同的数比如&#xff0c;不能是5 5 5 5&#xff0c;可以是1 2 2 2用这4个数排列出最大的数&#xff0c;2221&#xff0c;最小的数1222最大减最小&#xff1a;2221-12220999用0 9 9…

【音视频安卓开发 (八)】OpenSLES播放音频步骤和接口讲解

OpenSLES是安卓内部的音频播放和录音 初始化引擎 创建输出设备 配置PCM格式信息 初始化播放器 播放和缓冲队列 本文开源项目下载

kata_FizzBu​​zz Kata与Java流

kata在柔道练习仅几周之后&#xff0c;我的儿子感到无聊。 他抱怨说自己没有学任何东西&#xff0c;因为他一遍又一遍地做着同样的事情。 混淆学习和做新事物的不仅是幼儿。 例如&#xff0c;有多少软件开发人员通过执行kata或参加dojos来进行刻意练习的麻烦&#xff1f; 重复…

python中if语句的实例_对python中if语句的真假判断实例详解

说明 在python中&#xff0c;if作为条件语句&#xff0c;当if后面的条件参数为真时&#xff0c;则执行后面的语句块&#xff0c;反之跳过&#xff0c;为了深入理解if语句&#xff0c;我们需要知道if语句的真假判断方式。 示例 在python交互器中&#xff0c;经过测试发现以下条件…

ds18b20c语言显示小数位,DS18B20多点测温(读序列,匹配序列,51单片机C程序,1602显示)...

DS18B20多点测温(读序列&#xff0c;匹配序列&#xff0c;51 C程序&#xff0c;1602显示)程序一&#xff1a;单个读序列号。程序二&#xff0c;匹配并且读两个DS18B20&#xff0c;当然&#xff0c;读多个与读两个基本原理一样&#xff0c;只要加上其序列号等即可。本程序所有显…

【WebRTC---入门篇】(五)Web服务器原理与Nodejs搭建

Web服务器工作原理 Nodejs工作原理 首先自己开发的APPLICATION(自己开发的JS程序)输出给V8引擎,解析后的二进制文件调用NODE API,然后调用LIBUV事件处理库(插入到事件队列,在队列中不断循环处理事件)。 JavaScript解析 V8引擎先收到JS程序,解析生成JS语法树,通过解析器…

代理模式和动态代理模式_代理模式介绍

代理模式和动态代理模式代表&#xff1a;被选中或当选为他人投票或代理的人– Merriam-Webster 。 委托模式&#xff1a;在软件工程中&#xff0c;委托模式是面向对象编程中的一种设计模式&#xff0c;其中&#xff0c;一个对象而不是执行其陈述的任务之一&#xff0c;而是将该…

【WebRTC---入门篇】(六)JavaScript基础

变量与类型 var与let的区别&#xff0c;var局部变量&#xff1b;let全局变量 函数

javaio流层次结构_流的多层次分组

javaio流层次结构1.简介 使用Java 8流&#xff0c;可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中&#xff0c;我们将看到如何从简单的单级分组到更复杂的&#xff0c;涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象&#xff1a;人和宠物。 …