刚点开这道题以后,我的反应是:
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;
}