西工大数据结构NOJ18--建立二叉树的二叉链表

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

 

 

写完NOJ后看了一眼csdn,发现并没有人把算法的分析过程发出来。我使用的算法参考的是书上的第179页给出的算法流程,发出来供大家交流讨论。
首先题目给出我们一个前序序列和一个中序序列,要求输出后序序列。第一想法便是通过前序序列和中序序列建立一个二叉树,再通过后序遍历输出。那么,我们如何通过前序和中序确定一个二叉树呢?我们先明确前序和中序的特点。前序的访问顺序是根-左结点-右结点,中序则是左结点-根-右结点。我们可以发现前序中第一个结点一定是根结点。
OK,算法的设计思路来了,用一下分治的思想,我们可以找到前序的第一个结点,然后以此将中序序列分成左右子树,将左右子树的序列分别传给我们的创建二叉树的函数,反复如此(相信经过前三题的历练,大伙对递归已经有了一定的理解,这里递归部分直接贴代码),注意,前序序列只需要用同一个就行,你需要做的就是在当前中序的序列中,找到其中出现的第一个对应的前序序列中的结点,即可。是不是已经有思路了?可以尝试自己动手实践了!
老规矩,结尾贴上AC的源码并附上NOJ的测试样例,方便大伙调试。祝诸君学业有成,希望大伙可以点赞支持,抱拳。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* NOJ_18.c,建立二叉树的二叉链表
 * 由一个二叉树的前序序列和中序序列,输出后序序列
 * 编译:gcc NOJ_18.c -o NOJ_18.exe
 * 运行:./NOJ_18.exe
 * 输入:分两行分别输入一颗二叉树的前序和中序序列
 * 输出:输出该二叉树的后序序列
 *
 * author:Aimer
 * date: 2023-05-11
 */
//定义数据域类型
typedef char ElemType;
//定义二叉树节点
typedef struct BinTreeNode
{
    ElemType data;              //数据域
    struct BinTreeNode * left;  //左节点
    struct BinTreeNode * right; //右节点
}BinTreeNode,*PBinTreeNode;
//函数声明
void createBinTree(PBinTreeNode,char*,char*);//创捷二叉树
void postOrderOutput(PBinTreeNode);          //后序输出
//程序入口
int main(int argc,char* argv[])
{
    char str_pre[1000] = {0};
    char str_in[1000] = {0};
    scanf("%s",str_pre);
    scanf("%s",str_in);
    PBinTreeNode root = (PBinTreeNode)malloc(sizeof(BinTreeNode));
    createBinTree(root,str_pre,str_in);
    
    postOrderOutput(root);
    free(root);
    return 0;
}
/* 创建二叉树
 * node,一个二叉树节点指针,str_pre该树的前序序列,str_in中序
 * 通过前序确定节点,再中序中分割
 * 通过递归方式创建
*/
void createBinTree(PBinTreeNode node,char* str_pre,char* str_in)
{
    int i = 0,j=0,len = strlen(str_in);
    while(str_pre[j] != str_in[i])
    {
        if(i == strlen(str_in))
        {
            j++,i=0;
            continue;
        }
           i++;
    }
    node->data = str_pre[j];
    if(i==0)//如果没有左节点
        node->left = NULL;
    if(i==strlen(str_in)-1)
        node->right = NULL;
    if(i>0)
    {
        node->left = (PBinTreeNode)malloc(sizeof(BinTreeNode));
        char* str_left = (char*)malloc(sizeof(char)*(i+1));//多开一个空间用于填放'\0'
        for(int k=0;k<i;k++)
        {
            str_left[k] = str_in[k];
        }
        str_left[i] = 0;
        createBinTree(node->left,str_pre,str_left);
    }
    if(i<strlen(str_in)-1)
    {
        node->right = (PBinTreeNode)malloc(sizeof(BinTreeNode));
        char* str_right = (char*)malloc(sizeof(char) * (len - i)); //存放右子树序列
        for(int k=0;k<len-i-1;k++)
        {
            str_right[k] = str_in[k+i+1];
        }
        str_right[len-i-1] = '\0';
        createBinTree(node->right,str_pre,str_right);
    }

        
}
/* 后序输出
 * ptr_node,一个二叉树结节点指针
 * 通过后序方式递归输出
*/
void postOrderOutput(PBinTreeNode ptr_node){
	//后序遍历一棵二叉树 
	if(ptr_node->left){
		postOrderOutput(ptr_node->left);
	}
	if(ptr_node->right){
		postOrderOutput(ptr_node->right);
	}
	printf("%c",ptr_node->data);
}

/*
测试样例
ABDFGCEH
BFDGACEH
*/

西工大NOJ数据结构实验——2.1稀疏矩阵转置 阅读详情

相关推荐

西工大NOJ数据结构实验——1.2高精度计算PI值

西工大NOJ数据结构实验——1.2高精度计算PI值

a15735748145a的博客 2982

西工大noj答案完整版.doc

西北工业大学NOJC程序设计习题答案(非本人制作,侵删) 1.“1“的传奇 2.A+B 3.A+BⅡ 4.AB 5.ACKERMAN 6.Arithmetic Progressions 7.Bee 8.Checksum algorithm 9.Coin Test 10.Dexter need help 11.Double 12.Easy problem 13.Favorite number 14.Graveyard 15.Hailstone 16.Hanoi Ⅱ 17.Houseboat 18.Music Composer 19.Redistribute wealth 20.Road trip 21.Scoring 22.Specialized Numbers 23.Sticks 24.Sum of Consecutive 25.Symmetric Sort 26.The Clock 27.The Ratio of gainers to losers 28.VOL大学乒乓球比赛 29.毕业设计论文打印 30.边沿与内芯的差 31.不会吧,又是A+B 32.不屈的小蜗 33.操场训练 34.插入链表节点 35.插入排序 36.插入字符 37.成绩表计算 38.成绩转换 39.出租车费 40.除法 41.创建与遍历职工链表 42.大数乘法 43.大数除法 44.大数加法 45.单词频次 46.迭代求根 47.多项式的猜想 48.二分查找 49.二分求根 50.发工资的日子 51.方差 52.分离单词 53.分数拆分 54.分数化小数 55.分数加减法 56.复数 57.高低交换 58.公园喷水器 59.韩信点兵 60.行程编码压缩算法 61.合并字符串 62.猴子分桃 63.火车站 64.获取指定二进制位 65.积分计算 66.级数和 67.计算A+B 68.计算PI 69.计算π 70.计算成绩 71.计算完全数 72.检测位图长宽 73.检查图像文件格式 74.奖金发放 75.阶乘合计 76.解不等式 77.精确幂乘 78.恐怖水母 79.快速排序 80.粒子裂变 81.链表动态增长或缩短 82.链表节点删除 83.两个整数之间所有的素数 84.路痴 85.冒泡排序 86.你会存钱吗 87.逆序整数 88.排列 89.排列分析 90.平均值函数 91.奇特的分数数列 92.求建筑高度 93.区间内素数 94.三点顺序 95.山迪的麻烦 96.删除字符 97.是该年的第几天 98.是该年的第几天? 99.数据加密 100.搜索字符 101.所有素数 102.探索合数世纪 103.特殊要求的字符串 104.特殊整数 105.完全数 106.王的对抗 107.危险的组合 108.文件比较 109.文章统计 110.五猴分桃 111.小型数据库 112.幸运儿 113.幸运数字”7“ 114.选择排序 115.寻找规律 116.循环移位 117.延伸的卡片 118.羊羊聚会 119.一维数组”赋值“ 120.一维数组”加法“ 121.勇闯天涯 122.右上角 123.右下角 124.圆及圆球等的相关计算 125.圆及圆球等相关计算 126.程序员添加行号 127.找出数字 128.找幸运数 129.找最大数 130.整数位数 131.重组字符串 132.子序列的和 133.子字符串替换 134.自然数立方的乐趣 135.字符串比较 136.字符串复制 137.字符串加密编码 138.字符串逆序 139.字符串排序 140.字符串替换 141.字符串左中右 142.组合数 143.最次方数 144.最大乘积 145.最大整数 146.最小整数 147.最长回文子串 148.左上角 149.左下角

西工大NOJ数据结构理论——013.以十字链表为存储结构实现矩阵相加(严5.27)

西工大NOJ数据结构理论——013.以十字链表为存储结构实现矩阵相加(严5.27)

a15735748145a的博客 2571

西北工业大学数据结构noj_1-6题

西北工业大学数据结构noj_1-6题

西工大数据结构实验NOJ参考代码和分析合集

西工大数据结构实验noj全部代码。自己码完AC的。

qq_52590396的博客 1万+

西北工业大学数据结构noj1-1

【代码】西北工业大学数据结构noj

qq_44089695的博客 628

西北工业大学数据结构noj1-2

【代码】西北工业大学数据结构noj

qq_44089695的博客 744

NOJ-哈夫曼编/译码器-西工大数据结构

昨天老师讲完了哈夫曼书,回到宿舍就开始写,到今天才算是通过。题目如下:     分析一下题目,首先要构建一个哈夫曼树,然后先输出编码,再根据编码进行译码并输出。     构建哈夫曼树,就是取所有数据中权重最小的两个,组成一个小树,这个小树的权重就是这两个数据权重之和,然后反复进行这个操作(已成为叶节点的数据不再进行权重比较),就可以得到一课哈夫曼书。这里并没有用二叉链表来存储,而是使用

FREEstriker的博客 5538

西工大NOJ数据结构实验——实验2.3:稀疏矩阵加法,用十字链表实现C=A+B

西工大NOJ数据结构实验——实验2.3:稀疏矩阵加法,用十字链表实现C=A+B

a15735748145a的博客 4808

西工大数据结构极简解法--018建立二叉树二叉链表

题目描述 极简解法 #include<stdio.h> #include<string.h> char pre[1005],mid[1005]; void Convert(int prestart,int preend,int midstart,int midend) { int i; if(prestart==preend) return; for(i=midstart;i<midend&&mid[i]!=pre[prestart];i++); C

ZYP 769

西北工业大学数据结构实验答案.7z

其中37道数据结构实验代码亲测去全部可AC,其中部分题用的不是正统数据结构知识,但是能达到输出效果,如果有人想参考或者是题目快过期可直接拿来使用。

西工大NOJ答案(已找出所有错误并补充题,每道题都可找到)

已找出现存网络上各种版本的所有错误,每段代码都运行过,并修改成功AC了,而且补充题库,所有题都可以搜出来了。

西工大NOJ100+解答

西工大noj c++100题答案,有需要的下载。都懂的!

西北工业大学数据结构历届考题

西工大的同学们,复习数据结构可不能光看课件啊!做做题你就会知道该怎么考了

西北工业大学NOJ数据结构—007表达式括号匹配

    本题为栈的应用,整体思路如下(⇀‸↼‶):    依次读入一串字符串,若    4.    1.是左括号,则直接Push压进栈    2.如果是字符则继续读取下一个字符    3.如果是右括号,则与栈顶元素的左括号比较是否匹配,即‘)’与‘(’,‘】’与‘【’,‘}’与‘{’匹配如果出现不匹配则直接打印no并停止运行;如果匹配成功则将栈顶的左括号弹出;    4.等到所有字符串都读取完毕之...

npuyan的博客 2844

西北工业大学noj数据结构实验003稀疏矩阵转置

矩阵转置没什么好说的,都在注释里了,上代码: #include<stdio.h> #include <stdlib.h> #define ok 1 #define error 0 #define max 1000 typedef struct { int hang; int lie; int data; }seq; void zhuanzhi(seq zzj[],int j)//矩阵转置,i个元素 { int i; for( i=0;i&..

noj_h的博客 1585

NOJ-构造哈希表-西工大数据结构

    今天上课讲了哈希表,回来写了一下。题目如下:    看一下题,他说用最简单的方法建一个最简单的哈希表,然后输出平均查找长度,毫无难度。。。    我哈希表用了一个struct指针,如果要存东西,就申请一个节点并把节点地址塞里面,否则就是NULL,可以节省一点空间(虽然毫无必要。。。)。    我步数在建表的时候就算完了,最后算个和就行,当然也可以单纯建表,然后查找并记录步数,再求和,其实都...

FREEstriker的博客 1835

数据结构-基本概念和术语

一个。

XiaoQiao666999的博客 161

数据结构】栈

本文实现了一个基于链式结构的泛型栈,通过单链表头插头删操作实现入栈(push)、出栈(pop)、获取栈顶元素(peek)、获取大小(size)及判空(isEmpty)等核心方法,时间复杂度均为O(1)。栈是后进先出的数据结构,而虚拟机栈是JVM中线程私有的内存区域,栈帧则是方法调用时在虚拟机栈中分配的内存单元,三者在概念上存在本质区别。

careathers的博客 156
上一篇: 西工大数据结构实验2.1稀疏矩阵转置
下一篇: ubuntu下使用ros2的usb_cam包创建多个usb相机接口的实例——上
Aimerk
博客等级 码龄4年 6粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值