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

33 篇文章 8 订阅

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

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;
}

 

 

 

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值