前序遍历:先访问根节点,在访问左节点,在右节点
中序遍历:现访问左节点,在访问根节点,在右节点
后序遍历:现访问左节点,在访问右节点,在根节点(顺序以根节点为基准)
二叉树的遍历:分为前中和后中(一定要有中序遍历才能确定一个二叉树)
例如:前中序遍历:
前序:abdfecghi
中序:dbefaghci
思路:前序遍历中的第一个节点a一定是根节点,据此,我们在中序遍历里找到a,这个a把中序数组分为左(dbef)右(ghci)两部分(左是左儿子,右边是右儿子),然后前序第二个b,一定是左部分(dbef)的根节点,然后递归即可

#include<stdio.h>
#include<string.h>
char pre[50];前序点
char mid[50];中序点
char s[50];保存二叉树的节点
int len;点的个数
int i=0;作为pre的下标移动
void dff(int k,int beg,int end)k是左右儿子节点下标,beg、end分别是中序数组里的起始点和结束点
{if(beg>end) return;结束条件char key=pre[i];在前序中选根节点int j;for(j=beg;j<=end;j++)在中序中找到此根节点,以此划分左右两部分{if(key==mid[j]) break;}if(j>end) return; 这个条件找了很久,作用是根节点没有孩子,则终止递归s[k]=key;i++;printf("k=%d key=%c\n",k,key);打印这棵树dff(2*k,0,j-1);dff(2*k+1,j+1,end);
}
int main(void)
{//abdfecghi
//dbefaghcigets(pre);gets(mid);len=strlen(pre);dff(1,0,len-1);return 0;
}
上面的代码其实是错的,正确是把递归左二子改为dff(2*k,beg,j-1);是由于左边范围没选好,才需要if(j>end) return;

正确代码,

#include<stdio.h>
#include<string.h>
char pre[50];
char mid[50];
char s[50];
int len;
int i=0;
void dff(int k,int beg,int end)
{if(beg>end) return;char key=pre[i];int j;for(j=beg;j<=end;j++){if(key==mid[j]) break;}s[k]=key;i++;printf("k=%d key=%c\n",k,key);dff(2*k,beg,j-1);dff(2*k+1,j+1,end);
}
int main(void)
{gets(pre);gets(mid);len=strlen(pre);dff(1,0,len-1);return 0;
}

由于儿子们的范围选取不当,导致下面代码撸了很长时间,错误之处还在于左二子的范围不当,导致错误判断这个递归主体思路的正确性。不过这次我们先遍历右子树,是因为后序遍历的性质。
后序遍历:defbhgica
中序遍历:dbefaghci

#include<stdio.h>
#include<string.h>
char back[50];
char mid[50];
char s[50];
int len;
int i;
void dff(int k,int beg,int end)
{if(beg>end) return;char key=back[i];int j;for(j=beg;j<=end;j++){if(key==mid[j]) break;} s[k]=key;printf(" k=%d key=%c\n",k,key);i--;dff(2*k+1,j+1,end);dff(2*k,beg,j-1);
}
int main(void)
{gets(back);gets(mid);len=strlen(back);i=len-1;dff(1,0,len-1);return 0;
}

我们可以用结构体或者二叉链表来储存这颗树。

给出中后或者前中遍历,确定一个二叉树相关推荐

  1. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  2. java建树_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    本文实例讲述了Java实现的二叉树常用操作.分享给大家供大家参考,具体如下: import java.util.ArrayDeque; import java.util.Queue; import j ...

  3. 在Word2016及以上版本中,如何统一查看文章全部的脚注内容?个别脚注被增删,脚注顺序错乱怎么办?从一个Word复制到另一个Word中后,原文中脚注序号的格式变大了如何改回正常?

    一.在Word2016及以上版本中统一查看文章全部的脚注内容 操作:视图--草稿视图--引用--显示备注 效果如下:  二.个别脚注被增删,脚注顺序错乱怎么办 操作:在上一步操作基础上,光标停在脚注区 ...

  4. 线索二叉树(前中后序线索化/遍历/画线索)

    线索二叉树 文章目录 线索二叉树 1 线索二叉树的基本概念 2 线索二叉树的构造 2.1 线索二叉树的存储结构 2.2 给线索二叉树画线索 2.2.1 中序 2.2.2 先序 2.2.3 后序 2.3 ...

  5. 根据先序遍历建立一个二叉树

    编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的先序遍历字符串:ABC##DE#G##F### 其中"#"表示的是空格,空格 ...

  6. 二叉树前、中、后线索化及对应前、中、后序线索化遍历

    二叉树前中后线索化及对应前中后序线索化遍历(图解) 二叉树线索化都是套路,会一种另外两种只是稍微修改一下代码 值得一提的是后序线索化输出,逆序思维将后序线索化看成前序,采用"前序线索化输出& ...

  7. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  8. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  9. 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现

    二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...

最新文章

  1. C116实验室里故事
  2. ACM: 畅通工程-并查集-解题报告
  3. C语言优先级——取反和移位
  4. 【PAT乙级】1037 在霍格沃茨找零钱 (20 分)
  5. SpringBoot中整合Mail实现发送邮件
  6. 人脸Pose检测:ASM、AAM、CLM方法总结
  7. 从未来所思考到的事情
  8. 解决自动更新时 系统提示“某些设置由你的系统管理员管理”的方法
  9. 从0开始学习自动化测试框架cypress(二)DOM
  10. 思科路由器端口映射配置实例
  11. python定义一个字符串数组_python 变量,数组,字符串
  12. IMEI,手机号,身份证号格式有效性校验
  13. 关于Zxing生成DM二维码变形问题总结
  14. java五子棋程序_Java五子棋游戏
  15. Excel技巧:合并单元格后分组排序
  16. 学习《JavaScript高级程序设计》----day06
  17. vue2 elementui描述列表
  18. springboot微服务注册到nacos平台
  19. 招聘技术岗位-网络安全公司
  20. uniapp开发app使用AntV F6

热门文章

  1. Python中6种基本数据类型
  2. Device Tree(三):代码分析
  3. 黄聪:原生js的音频播放器,兼容pc端和移动端(原创)
  4. 初学Python——文件操作第三篇
  5. 【原】IOS文件操作
  6. “安全即代码”:整合安全团队和DevOps团队
  7. 如何修改系统时间显示格式
  8. TI PDK3.0 qt 交叉编译环境设置
  9. Linux SWAP分区占用率高,刷新SWAP分区方法
  10. ARM指令集 VS Thumb指令集