c语言二叉树的还原,由中序遍历和层次遍历还原二叉树。C语言实现
经测,该代码已经修改正确,只需在void BuildTree(char *level,char *inorder,pBiTree T)这里的最后一个变量T改为引用即可。还有一个地方判断调用右子树的地方的判断条件。
#include聽
#include聽
#include聽
typedef聽struct聽_BiTree
{
聽聽聽聽char聽data;
聽聽聽聽struct聽_BiTree聽*lchild;
聽聽聽聽struct聽_BiTree聽*rchild;
}BiNode,聽*pBiTree;
void聽BuildTree(char聽*level,char聽*inorder,pBiTree聽&T)
{
聽聽聽聽int聽i;
聽聽聽聽int聽len=strlen(level);聽聽//取得层次遍历长度
聽聽聽聽int聽pos=0;
聽聽聽聽if(len==0)
聽聽聽聽聽聽聽聽return聽;
聽聽聽聽char聽*p=strchr(inorder,level[0]);
聽聽聽聽if(p==NULL)聽聽聽聽聽//如果为空则抛弃第一个,跳到下一个;
聽聽聽聽{
聽聽聽聽聽聽聽聽char聽*L=(char*)malloc(sizeof(char)*len);聽聽聽聽//开辟数组
聽聽聽聽聽聽聽聽strncpy(L,level+1,len-1);聽聽聽聽聽聽聽//舍弃第一个
聽聽聽聽聽聽聽聽L[len-1]=0;
聽聽聽聽聽聽聽聽BuildTree(L,inorder,T);聽聽聽聽聽//调用建树函数
聽聽聽聽聽聽聽聽return聽;
聽聽聽聽}
聽聽聽聽pos=p-inorder;聽聽聽聽聽聽//得到中序遍历左子树字符串长度
聽聽聽聽T->data=level[0];聽聽聽//为根节点赋值
聽聽聽聽T->lchild=NULL;
聽聽聽聽T->rchild=NULL;
聽聽聽聽if(pos!=0)聽聽//左子树的递归调用
聽聽聽聽{
聽聽聽聽聽聽聽聽T->lchild=(pBiTree)malloc(sizeof(BiNode));
聽聽聽聽聽聽聽聽char聽*left_level=(char*)malloc(sizeof(char)*len);
聽聽聽聽聽聽聽聽char聽*left_inor=(char*)malloc(sizeof(char)*(pos));
聽聽聽聽聽聽聽聽strncpy(left_level,level+1,len-1);聽聽//舍去层次遍历第一个
聽聽聽聽聽聽聽聽strncpy(left_inor,inorder,pos);聽聽聽聽聽//截取左子树字符串
聽聽聽聽聽聽聽聽left_level[len-1]=0;
聽聽聽聽聽聽聽聽left_inor[pos]=0;
聽聽聽聽聽聽聽聽BuildTree(left_level,left_inor,T->lchild);
聽聽聽聽}
聽聽聽聽if(pos聽rchild=(pBiTree)malloc(sizeof(BiNode));
聽聽聽聽聽聽聽聽char聽*right_level=(char*)malloc(sizeof(char)*(len));
聽聽聽聽聽聽聽聽char聽*right_inor=(char*)malloc(sizeof(char)*(len-pos));
聽聽聽聽聽聽聽聽strncpy(right_level,level+1,len-1);
聽聽聽聽聽聽聽聽strncpy(right_inor,inorder+pos+1,len-pos-1);
聽聽聽聽聽聽聽聽right_level[len-1]=0;
聽聽聽聽聽聽聽聽right_inor[len-pos-1]=0;
聽聽聽聽聽聽聽聽BuildTree(right_level,right_inor,T->rchild);
聽聽聽聽}
}
void聽priOrder(pBiTree聽T)
{
聽聽聽聽if聽(T聽!=聽NULL){
聽聽聽聽聽聽聽聽printf聽("%c",聽T->data);
聽聽聽聽聽聽聽聽priOrder(T->lchild);
聽聽聽聽聽聽聽聽priOrder(T->rchild);
聽聽聽聽}
}
void聽postOrder(pBiTree聽T)
{
聽聽聽聽if聽(T聽!=聽NULL){
聽聽聽聽聽聽聽聽postOrder(T->lchild);
聽聽聽聽聽聽聽聽postOrder(T->rchild);
聽聽聽聽聽聽聽聽printf聽("%c",聽T->data);
聽聽聽聽}
}
void聽freeNode(pBiTree聽&T)
{
聽聽聽聽if聽(T聽!=聽NULL){
聽聽聽聽聽聽聽聽freeNode(T->lchild);
聽聽聽聽聽聽聽聽freeNode(T->rchild);
聽聽聽聽聽聽聽聽free(T);
聽聽聽聽}
}
int聽main()
{
聽聽聽聽pBiTree聽root;
聽聽聽聽char聽level[28],聽inorder[28];
聽聽聽聽int聽n;
聽聽聽聽scanf聽("%d",聽&n);
聽聽聽聽//fflush(stdin);
聽聽聽聽getchar();
聽聽聽聽while聽(n聽--){
聽聽聽聽聽聽聽聽scanf聽("%s%s",聽level,聽inorder);
聽聽聽聽聽聽聽聽root聽=聽(pBiTree)malloc(sizeof(BiNode));
聽聽聽聽聽聽聽聽BuildTree(level,聽inorder,聽root);
聽聽聽聽聽聽聽聽priOrder(root);
聽聽聽聽聽聽聽聽printf聽("\n");
聽聽聽聽聽聽聽聽postOrder(root);
聽聽聽聽聽聽聽聽printf聽("\n");
聽聽聽聽聽聽聽聽//freeNode(root);
聽聽聽聽}
聽聽聽聽return聽0;
}
c语言二叉树的还原,由中序遍历和层次遍历还原二叉树。C语言实现相关推荐
- java根据前序和中序建树_(Java实现)二叉树---根据前序、中序、后序数组还原二叉树...
概述在上一篇文章中讲到顺序存储二叉树,一般是用于完全二叉树,通过统一的数学公式可以将数组还原成完全二叉树 而对于普通的二叉树来说,也可以根据前序.中序和后序遍历得到的数组,还原二叉树 还原还原的情况分 ...
- C语言利用二叉树的操作实现根据给定的字符串生成二叉树并前序、中序、后序输出二叉树。
C语言利用二叉树的操作实现根据给定的字符串生成二叉树并前序.中序.后序输出二叉树. Description 根据给定的字符串生成二叉树并前序.中序.后序此二叉树. Input 给定一字符串,其中#表示 ...
- C语言实现二叉树的中序线索化及遍历中序线索二叉树
C语言实现二叉树的线索化以及如何遍历线索二叉树! 文章目录 线索二叉树的结构及数据类型定义 根据输入结点初始化二叉树 中序遍历二叉树并线索化 遍历中序线索二叉树 项目完整代码 项目完整代码(改进版) ...
- 二叉树的前序、中序、后序遍历与创建
#include <iostream> #include <string> #include <stack> using namespace std; struct ...
- 由先序遍历和中序遍历得到后序遍历和层次遍历(二叉树)
前几天写了1020 Tree Traversals (25 分)-PAT甲级这个题目,明白了如何由二叉树的后序遍历和中序遍历得到先序遍历和层次遍历.受这道题启发,思考了一下如何由二叉树的先序遍历和中序 ...
- 非递归实现二叉树的前序、中序、后序遍历
目录 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 根据二叉树的前序和中序遍历结果还原二叉树 根据二叉树的中序和后序遍历结果还原二叉树 非递归遍历需要借助栈. 非 ...
- 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)
前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...
- 玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历
题目: 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第 ...
- LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)
二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...
- 如何判断二叉树的前序,中序,后序遍历
文章目录 前言 一.如何判断二叉树的前序,中序,后序遍历? 二.已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历? 三.程序实现 总结 前言 最近复习题中看到二叉树,对于它的前序,中序,后序遍历的 ...
最新文章
- hibernate select 读取结果集的两种办法
- telnet工具_Telnet进入Linux时出现乱码
- leetCode第五题-求字符串最长回文字符串
- 【51单片机快速入门指南】5.1:SPI与DS1302时钟芯片
- php 远程图片合拼,PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】...
- python创意爱情代码大全-王牌花色-题解(Python代码)
- Oracle教程之分析Oracle索引扫描四大类
- 3.7.1 - Strings
- 解决方案:rabbitmq使用场景-超时未支付订单处理
- 三维立体动画制作技巧
- R语言案例分析:多元数据的基本统计分析
- srand和rand详细讲解
- 计算机流水线重要知识,计算机组成与体系结构——流水线相关知识点(常考计算)...
- 今日学习在线编程题:幻数
- 区块链软件开发公司 区块链带给信贷行业的优势
- 前端gitlab-ci打包流水线优化
- iOS7初体验(1)——第一个应用程序HelloWorld
- 24V转12V,9V,8V,6V,5V,3.3V,3V降压芯片和线性LDO选型介绍
- matlab 双边沿滤波,一种基于数字PWM发生器的左增长双边沿UPWM信号频谱估计方法与流程...
- OA与BPM究竟有啥区别