刚点开这道题以后,我的反应是:

1.打开老师发的PPT:DS-Chap6,然后翻到第70页;

2.跟着图解,自己照着画了三四遍(其实是抄了三四遍;

3.然后自己出了一个比较简单的题:

先序:ABDCE

中序:BDACE

因为这个简单,用的步骤少,反复做几次用的时间少,容易出思路,所以我就以它为例,自己想着构建了一棵二叉树。

4.把3.中的二叉树画了十来遍之后,心里大概有了个谱,然后在二叉树上每一次笔动一下,都问自己两个问题:1.为什么这样做?2.下一步该怎么做?每一次问完自己后,就把这2个问题的答案按顺序和层次写下来。(我发现,对于这2个问题的答案,就是代码直接翻译过来以后的结果

5.接着我回头看4.中写下来的答案,找出相同答案部分,这相同的部分就是递归函数的函数体。然后整理4.中写下来的答案。

6.然后,我在纸上把5.整理后的答案直接翻译成C代码

7.下面是惯例的一步:我在Dev上,用了10分钟把代码照着纸上写的敲了进去,然后又用了10分钟写了下主函数中的输入输出部分。

8.用了下面这个思路简单,步骤很少的例子测试,发现黑框框里没反应:

9.然后一步步调试,发现原因呢,是因为一级指针不够用,所以引入了二级指针

10.修改成二级指针后,反反复复又改了很多遍(改的都是些带不带*,带不带&,然后变量名是不是对应上了这些问题,而递归思路却是正确的,所以没有改递归思路)。

11.最后再去提交,就成功AC啦!

好了,现在分享源码啦:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef char DataType;
typedef struct BinTreeNode{DataType info;struct BinTreeNode* lchild;struct BinTreeNode* rchild;
}BinTreeNode,*PBinTreeNode; void InitializeBinTreeNode(PBinTreeNode PNode){//初始化二叉树中的单个结点 PNode->info='0';PNode->lchild=NULL;PNode->rchild=NULL;
}PBinTreeNode CreateBinTreeNode(){//创建二叉树中的单个结点 PBinTreeNode PNode=(PBinTreeNode)malloc(sizeof(BinTreeNode));if(PNode==NULL){printf("out of space!");}else{InitializeBinTreeNode(PNode);return PNode;}
}PBinTreeNode Recursion(char **pp_pre,char *begin,char *end){//根据先序和中序,创建一棵完整二叉树  PBinTreeNode cur=CreateBinTreeNode();cur->info=**pp_pre;char *temp;for(temp=begin;((*temp)!=(**pp_pre))&&(temp<=end);temp++);if(begin!=temp){(*pp_pre)++;cur->lchild=Recursion(pp_pre,begin,temp-1);}else{cur->lchild=NULL;}if(temp!=end){(*pp_pre)++;cur->rchild=Recursion(pp_pre,temp+1,end);}else{cur->rchild=NULL;}return cur;
}void PostOrderOutput(PBinTreeNode ptr_node){//后序遍历一棵二叉树 if(ptr_node->lchild){PostOrderOutput(ptr_node->lchild);}if(ptr_node->rchild){PostOrderOutput(ptr_node->rchild);}printf("%c",ptr_node->info);
}int main(){ char pre[1000]={0};char in[1000]={0};scanf("%s%s",pre,in);char *p_pre=pre;//因为要确保递归过程中,所有函数都用同一个p_pre //所以设置一个二级指针pp_pre char **pp_pre=&p_pre;//下面指针begin和end都只用在数组in中 char *begin=in;char *end=begin+1;for(;*(end+1)!='\000';end++);//递归构建一棵二叉树 PBinTreeNode tree=Recursion(pp_pre,begin,end);//后序输出一棵二叉树 PostOrderOutput(tree);return 0;
}

西工大NOJ数据结构理论——018.建立二叉树的二叉链表(严6.65)相关推荐

  1. 西工大NOJ数据结构理论——015.建立二叉树的二叉链表存储结构(严6.70)

    我相信,大家都已经了解了这道题的背景,以及明白了我们需要做的事情. 对于这道题的背景,相信大家都熟悉,所以就不说了. 关于我们需要做的事情,大家也已经有了自己的思路.所以,我只在下面简短的写一写我的思 ...

  2. 西工大NOJ数据结构理论——016.计算二叉树叶子结点数目(耿6.14)

    一.初级思路 拿到题之后的好习惯--先在纸上写思路: 1.构建二叉树: char* BinTreeBuilding(PBinTreeNode ptr_node,char *ptr_str){//创建二 ...

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

      我第一下拿到这个题目,第一反应就是先定义好数据结构,然后构建好十字链表基础操作的函数,也就是"创插遍历"这些操作.下面是我的定义和函数操作. typedef int ElemT ...

  4. 西工大NOJ数据结构理论——021.逆波兰表达式(严7.38)

    这道题我参考的是(80条消息) 『西工大-数据结构-NOJ』 021-逆波兰表达式(耿7.38) 『西北工业大学』__LanXiu的博客-CSDN博客 (准确来说是快期末考试了,所以各科老师都在疯 狂 ...

  5. 西工大NOJ数据结构理论——017.输出以二叉树表示的算术表达式(严6.51)

    (17条消息) 『西工大-数据结构-NOJ』 017-输出以二叉树表示的算术表达式(耿6.51) 『西北工业大学』__LanXiu的博客-CSDN博客 上面是我参考的一位学长的博客. 先序建立二叉树, ...

  6. 西工大NOJ数据结构理论——007.表达式括号与匹配(严3.19)

    害怕提交次数过多,然后不再跑代码,影响成绩,所以又重新创建了两个号来测这道题. 结果全都正确,但就是一直"WA",然后Debug了近5个小时才把"WA"改成&q ...

  7. 西工大NOJ数据结构理论——010.k阶斐波那契数列(严3.32)

    k阶斐波那契序列定义:第k和k+1项为1,前k - 1项为0,从k项之后每一项都是前k项的和 k=2时,斐波那契序列为:0,1,1,2,3,5,8,13... k=3时,斐波那契序列为:0,0,1,1 ...

  8. 西工大NOJ数据结构理论——001.顺序表的插入运算(耿2.4)

    #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct NODE {int n ...

  9. 西工大NOJ数据结构理论——019.基于图的深度优先搜索策略(耿7.10)

    临近期末考了,所以思路来不及整理了,但大家还是可以仿照我的上几篇文章,"先动笔,再代码"的思路还是不变的. #include<stdio.h> #include< ...

最新文章

  1. pytorch学习笔记(十二):详解 Module 类
  2. 在linux中怎么重置mysql密码_详解如何在Linux(CentOS)下重置MySQL根(Root)密码
  3. js php 实现日历签到_PHP 可能在未来十年内消失?
  4. react安装_「React实战」三分钟搭建React开发环境
  5. ES6的变量声明详述
  6. Kubernetes:通过自动化节省IT预算的4种方法
  7. 算法岗SSP offer收割指南!
  8. 我国博士不是太多了,而是太少了!
  9. 前端工程师如何理解 TCP/IP 传输层协议?| 技术头条
  10. 十七 Ajax校验用户名功能
  11. Eclipse设置Android Logcat输出字体大小
  12. 数字 三位一节(逗号隔开)表示
  13. 3dmax说课稿计算机平面设计,3dsmax说课稿.ppt
  14. 如何在MAC上查看系统运行信息、内存使用率等
  15. CE+OD外挂制作实战 [提高篇]
  16. 显示答案c语言代码编程,c语言编程例题及答案
  17. google源码下载方法
  18. 盗取QQ密码的顽固的IEXPLORE.EXE病毒
  19. android电视怎么使用教程,手机无线投屏到电视机的方法和具体该操作
  20. 根据排队论阐述路由器和高速公路的拥堵以及拥堵缓解问题(二)

热门文章

  1. 我的世界服务器死亡不显示,我的世界 服务器怎么开启死亡不掉落 需要 – 手机爱问...
  2. gemfire mysql_用GemFire做Hibernate二级缓存
  3. C语言中关于复合语句的一些问题
  4. 红米Note11 Pro和Note11T Pro 区别 红米note11pro和note11tpro哪个好
  5. Android重力感应 .
  6. B站品牌如何实现年轻化营销?看奥利奥在B站解锁更多种草“玩法”!
  7. 记录:latex表达符号
  8. 02【存储引擎、索引】
  9. 凭什么美柚又融了3500万美刀?
  10. 技术分享 | 国产麒麟 arm 上编译安装 xtrabackup8